目录
二叉树功能函数
void CreateTree(BiTree& T); //先序创建二叉树
void PreOrderTraverse(BiTree T); //先序遍历
void InOrderTraverse(BiTree T); //中序遍历
void PostOrderTraverse(BiTree T); //后序遍历
void levelOrderTraverse(BiTree T); //层次遍历
int Copy(BiTree T,BiTree &T1); //复制二叉树
int Depth(BiTree T); //计算二叉树深度
int NodeCount(BiTree T); //计算二叉树结点总数
int LeadCount(BiTree T); //计算二叉树叶子结点总数
测试样例
/*------------
树的形状:
a
b c
d e f
--------------*/
样例输入:
a b d # # e # # c f # # #
样例输出:
二叉树已经按照先序构建
先序遍历:a b d e c f
中序遍历:d b e a f c
后序遍历:d e b f c a
层次遍历:a b c d e f
二叉树的深度为:3
二叉树的结点数为:6
二叉树的叶子结点数为:3
二叉树已复制
复制二叉树的先序遍历:a b d e c f
复制二叉树的中序遍历:d b e a f c
复制二叉树的后序遍历:d e b f c a
复制二叉树的层次遍历:a b c d e f
说明:如果结点为叶子结点,只需将左右孩子的值置为'#',(即紧邻之后的两个输入为'#');
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//先序构造二叉树
void CreateTree(BiTree& T){
TElemType ch;
cin >> ch;
if(ch == '#')
T = NULL;
else {
T = new BiTNode;
T->data = ch;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
//先序遍历
void PreOrderTraverse(BiTree T) {
if(T == NULL)
return ;
cout << T->data << " ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
//中序遍历
void InOrderTraverse(BiTree T) {
if(T == NULL)
return ;
InOrderTraverse(T->lchild);
cout << T->data << " ";
InOrderTraverse(T->rchild);
}
//后序遍历
void PostOrderTraverse(BiTree T) {
if(T == NULL)
return ;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data << " ";
}
//层次遍历输出二叉树
void levelOrderTraverse(BiTree T) {
if(T == NULL)
return;
queue<BiTNode*> q;
q.push(T);
while(!q.empty()) {
int n = q.size();
for(int i = 0; i < n; i++) {
BiTNode* s = q.front();
cout << s->data << " ";
q.pop();
if(s->lchild)
q.push(s->lchild);
if(s->rchild)
q.push(s->rchild);
}
}
}
//复制二叉树
int Copy(BiTree T,BiTree &T1) {
if(T == NULL) {
T1 = NULL;
return 0;
}
T1 = new BiTNode;
T1->data = T->data;
Copy(T->lchild, T1->lchild);
Copy(T->rchild, T1->rchild);
}
//计算二叉树深度
int Depth(BiTree T) {
if(T == NULL)
return 0;
int m, n;
m = Depth(T->lchild) + 1;
n = Depth(T->rchild) + 1;
return max(m, n);
}
//计算二叉树结点总数
int NodeCount(BiTree T) {
if(T == NULL)
return 0;
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
//计算二叉树叶子结点总数
int LeadCount(BiTree T) {
if(T == NULL)
return 0;
if(T->lchild == NULL && T->rchild == NULL)
return 1;
return LeadCount(T->lchild) + LeadCount(T->rchild);
}
int main(){
BiTree T, T1;
CreateTree(T);
cout << "二叉树已经按照先序构建";
cout << endl << "先序遍历:";
PreOrderTraverse(T);
cout << endl << "中序遍历:";
InOrderTraverse(T);
cout << endl << "后序遍历:";
PostOrderTraverse(T);
cout << endl << "层次遍历:";
levelOrderTraverse(T);
cout << endl << "二叉树的深度为:";
cout << Depth(T);
cout << endl << "二叉树的结点数为:";
cout << NodeCount(T);
cout << endl << "二叉树的叶子结点数为:";
cout << LeadCount(T);
cout << endl << "二叉树已复制";
Copy(T, T1);
cout << endl << "复制二叉树的先序遍历:";
PreOrderTraverse(T1);
cout << endl << "复制二叉树的中序遍历:";
InOrderTraverse(T1);
cout << endl << "复制二叉树的后序遍历:";
PostOrderTraverse(T1);
cout << endl << "复制二叉树的层次遍历:";
levelOrderTraverse(T1);
}