编写一个程序,实现二叉树的各种运算,并在此基础上设计一个程序完成如下功能:
(1)创建一棵二叉树(用键盘按照先序遍历序列输入一个字符串生成二叉树);
(2)输出前序、中序、后序遍历的遍历序列;
(3)统计并输出二叉树的的结点个数;
(4)输出二叉树的叶子结点的个数;(选做)
实验要求:
用键盘输入一个字符串,按照满二叉树的特点生成一棵二叉树。
测试用例要求:
如下二叉树的输入字符串为:ABD###C#E##
书写方法:碰到#说明该二叉树是一棵空树,注意分配(下面缺两个左右补两个#,缺一个左/右子树,补一个#)
二叉链表的结点类型(C++):
Typedef structure tnode{
int data;
structure tnode *lchild, *rchild;
}bitree,*bitlink ;
用上面的二叉树作为例子:
#include<bits/stdc++.h>
using namespace std;
typedef int Status;
typedef char TElemType;
#define OVERFLOW -1
#define ERROR 0
#define OK 1
char ch;
/**
* 采用二叉链表的存储形式
*/
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
/**
* 创建一棵二叉树
*/
void CreateBiTree(BiTree &T) {
//按先序次序输入二叉树中结点的值,创建二叉链表表示的二叉树T
TElemType ch;
cin>>ch;
if(ch == '#'){//递归结束,建空树
T = NULL;
} else {
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
/**
* 先序遍历
*/
void PreOrderTraverse(BiTree &T)
{//先序遍历二叉树T的递归算法
if(T) //若二叉树非空
{
cout << T->data << " "; //访问根结点
PreOrderTraverse(T->lchild); //中序遍历左子树
PreOrderTraverse(T->rchild); //中序遍历右子树
}
}
/**
* 中序遍历
*/
void InOrderTraverse(BiTree &T) {
if (T) {
InOrderTraverse(T->lchild);
cout << T->data << " ";
InOrderTraverse(T->rchild);
}
}
/**
* 后序遍历
*/
void PostOrderTraverse(BiTree &T)
{//后序遍历二叉树T的递归算法
if(T) //若二叉树非空
{
PostOrderTraverse(T->lchild); //中序遍历左子树
PostOrderTraverse(T->rchild); //中序遍历右子树
cout << T->data << " "; //访问根结点
}
}
/**
* 统计二叉树中节点个数
*/
int NodeCount (BiTree &T) {
if (T == NULL) {
return 0;
} else {
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
}
/**
* 二叉树中叶结点个数
*/
int LeavesCount (BiTree &T) {
if (T == NULL) {
return 0;
} else if (T->lchild == NULL && T->rchild == NULL) {
return LeavesCount(T->lchild) + LeavesCount(T->rchild) + 1;
}
else {
return LeavesCount(T->lchild) + LeavesCount(T->rchild);
}
}
int main() {
BiTree test = new BiTNode;
cout << "请输入一个字符串以生成二叉树:";
CreateBiTree(test);
cout <<"\n"<< "先序遍历结果:";
PreOrderTraverse(test);
cout <<"\n"<< "中序遍历结果:";
InOrderTraverse(test);
cout <<"\n"<< "后序遍历结果:";
PostOrderTraverse(test);
cout <<"\n"<< "二叉树结点个数:"<<NodeCount(test);
cout <<"\n"<< "二叉树叶结点个数:"<<LeavesCount(test);
}
DFS 遍历分三种情况:先序、中序、后序
各种遍历结果
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function (root) {
let result = [];
let preorder = (data) => {
if (data) {
result.push(data.val);
preorder(data.left);
preorder(data.right);
}
};
preorder(root);
return result;
};
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function (root) {
let result = [];
let inorder = (data) => {
if (data) {
inorder(data.left);
result.push(data.val);
inorder(data.right);
}
};
inorder(root);
return result;
};
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var postorderTraversal = function (root) {
let result = [];
let postorder = (data) => {
if (data) {
postorder(data.left);
postorder(data.right);
result.push(data.val);
}
};
postorder(root);
return result;
};
评论区