先序输入:类似abc##de#g##f###表示二叉树。
输出结果:
先序遍历:
中序遍历:
后序遍历:
非递归中序遍历:
"叶子节点的个数为:
树的深度为:
#include <iostream>
#include <stack>
using namespace std;
#define none '#'
typedef char TelemType; // 节点数据域类型
// 二叉链表存储
typedef struct Binode{
TelemType data;
struct Binode *lchild,*rchild;
}Binode,* Bitree;
// 按先序输入建立二叉树
int CreateBiTree(Bitree& T){
TelemType ch;
scanf("%c",&ch);
if(ch == none ) T = NULL;
else{
T = new Binode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 1;
}
// 按照先序遍历二叉树
int PreOrder(Bitree T){
if(T){
printf("%c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
return 1;
} else return 0;
}
//中序遍历
int InOrder(Bitree T){
if(T){
if(T->lchild) InOrder(T->lchild);
printf("%c",T->data);
if(T->rchild) InOrder(T->rchild);
return 1;
} else return 0;
}
//后序遍历
int PostOrder(Bitree T){
if(T){
if(T->lchild) PostOrder(T->lchild);
if(T->rchild) PostOrder(T->rchild);
printf("%c",T->data);
return 1;
}return 0;
}
//非递归中序遍历
int InOrderTraverse1(Bitree T){
stack<Bitree> s; //存放节点指针
s.push(T);
while(! s.empty()){
while(s.top()) s.push(s.top()->lchild); //向左走到尽头
s.pop(); //空指针退栈
if(!s.empty()){
Bitree t = s.top();
s.pop(); // 根节点出栈
printf("%c",t->data);
s.push(t->rchild);
}
}
return 1;
}
int InOrderTraverse2(Bitree T){
stack<Bitree> s;
Bitree p = T; //当前遍历节点
while(!s.empty() || p){
if(p){
s.push(p); //根节点进栈
p = p->lchild; //遍历左子树
}else{
p = s.top();
s.pop(); //返回上一根节点
printf("%c",p->data);
p = p->rchild; // 遍历右节点
}
}
return 1;
}
int Leaf(Bitree T)
{
int count;
if(T==NULL)
count=0;
else if(T->lchild==NULL&&T->rchild==NULL)
count=1;
else
count=Leaf(T->lchild)+Leaf(T->rchild);
return count;
}
int Depth(Bitree T)
{
int m,n;
if(T==NULL)
return 0;//如果是空树,深度为0,递归结束
else
{
m=Depth(T->lchild);//递归计算左子树的深度记为m
n=Depth(T->rchild);//递归计算右子树的深度记为n
if(m>n)
return (m+1);//二叉树的深度为m 与n的较大者加1
else
return (n+1);
}
}
int main(){
printf("先序输入:类似abc##de#g##f###表示二叉树。\n");
Bitree T;
CreateBiTree(T);
int count=Leaf(T);
cout<<"先序遍历:";
PreOrder(T);
cout<<"\n中序遍历:";
InOrder(T);
cout<<"\n后序遍历:";
PostOrder(T);
cout<< endl;
cout<<"\n非递归中序遍历:";
InOrderTraverse1(T);
printf("\n");
printf("叶子节点的个数为:%d",count);
cout<<endl;
cout<<"树的深度为:"<<Depth(T)<<endl;
return 0;
}