二叉树的链式结构创建(创建时采用先序遍历顺序创建)、求二叉树的深度、求二叉树的叶子节点、求二叉树的总节点、先序遍历、中序遍历、后序遍历。
Status.h
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
BiTree.h
typedef struct BiTNode {
ElemType data;//数据域
struct BiTNode *lchild,*rchild;//指针域
}BiTNode,*BiTree;
void CreateBiTree(BiTree& T) {//先序创建二叉树
char ch;
cin >> ch;//输入数据
if(ch == '#')
{
T = NULL;
} else {
T = new BiTNode;//新建一个节点
T->data = ch;//数据域为输入的内容
CreateBiTree(T->lchild);//递归创建左子树
CreateBiTree(T->rchild);//递归创建右子树
}
}
int Depth(BiTree T)//计算二叉树深度
{
int m,n;
if(T == NULL) {//如果是空树,则返回0
return 0;
} else {
m = Depth(T->lchild);//递归计算左子树的深度记为m
n = Depth(T->rchild);//递归计算右子树的深度记为n
if(m > n) {
return m + 1;
} else {
return n + 1;
}
}
}
int NodeCount(BiTree T) {
if(T == NULL) {//空的返回0
return 0;
} else {
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
}
int LeavesNodeCount(BiTree T)//
{
if(!T) return 0;
else if(!T->lchild&&!T->rchild) return 1;
else return LeavesNodeCount(T->lchild)+LeavesNodeCount(T->rchild);
}
void PreOrderTraverse(BiTree 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) {//后
if(T) {
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data << " ";
}
}
main.cpp
#include <iostream>
using namespace std;
#include "Status.h"
typedef char ElemType;
#include "BiTree.h"
int main()
{
BiTree T;
CreateBiTree(T);
cout<<"二叉树的深度为:"<<Depth(T)<<endl;
cout<<"二叉树中结点个数为:"<<NodeCount(T)<<endl;
cout<<"二叉树中叶子结点个数为:"<<LeavesNodeCount(T)<<endl;
cout<<"先序遍历:";
PreOrderTraverse(T);
cout<<"\n中序遍历:";
InOrderTraverse(T);
cout<<"\n后序遍历:";
PostOrderTraverse(T);
cout<<endl;
}
测试:
构建如图所示的二叉树进行测试:
按照先序遍历的输入顺序进行输入。