#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
#define ok 1
#define error 0
#define overflow -2
typedef char NodeDataType;
int cnt ;
int deep ;
typedef struct BiTNode{
NodeDataType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void InitBiTree(BiTree &T) //树的初始化
{
T = NULL;
}
void DestroyBiTree(BiTree &T) //销毁一个树
{
if(T)
{
DestroyBiTree(T -> lchild);
DestroyBiTree(T -> rchild);
delete T;
//T = NULL;
}
}
void CreateBiTree(BiTree &T) //创建一个树
{
char ch;
scanf("%c",&ch);
if(ch == ' ') T = NULL;
else
{
T = new BiTNode;
if(!T)
exit(overflow);
T -> data = ch;
CreateBiTree(T -> lchild);
CreateBiTree(T -> rchild);
}
return ;
}
void PreOrderTraverse(BiTree T) //先序访问
{
if(T)
{
cout << T -> data << " ";
PreOrderTraverse(T -> lchild);
PreOrderTraverse(T -> rchild);
}
//return ;
}
void InOrderTraverse(BiTree T) //中序访问
{
if(T)
{
InOrderTraverse(T -> lchild);
cout << T -> data << " ";
InOrderTraverse(T -> rchild);
}
//return ;
}
void PostOrderTraverse(BiTree T) //后序访问
{
if(T)
{
PostOrderTraverse(T -> lchild);
PostOrderTraverse(T -> rchild);
cout << T -> data << " ";
}
//return ;
}
BiTree Findmode(BiTree T,NodeDataType x) // 找到值为 x 的结点
{
BiTree t;
if(T == NULL)
t = NULL;
else if(T -> data == x)
t = T;
else{
t = Findmode(T -> lchild,x);
if(t == NULL)
t = Findmode(T -> rchild,x);
}
return t;
}
void countleaf(BiTree T,int *cnt) //统计叶子结点的个数
{
if(T)
{
if(T -> lchild == NULL && T -> rchild == NULL)
{
cout << T -> data << " ";
(*cnt)++;
}
countleaf(T -> lchild,cnt);
countleaf(T -> rchild,cnt);
}
}
int BiTreeDepth(BiTree T) //返回树的深度
{
int i = 1,j = 1;
if(T == NULL)
return 0;
i += BiTreeDepth(T -> lchild);
j += BiTreeDepth(T -> rchild);
return i > j ? i : j;
}
void BiTreeClear(BiTree &T)
{
if(T)
{
T = NULL;
}
}
bool BiTreeEmpty(BiTree T)
{
if(T == NULL)
return true;
else
return false;
}
void InOrder(BiTree T) //中序非递归算法1
{
stack<BiTree> s;
s.push(T);
while(!s.empty())
{
BiTree p;
while((p = s.top()) && p) s.push(p -> lchild); // 向左走到尽头
s.pop(); //空指针出栈
if(!s.empty())
{
p = s.top();
s.pop();
cout << p -> data << " ";
s.push(p -> rchild);
}
}
}
/*void InOrder(BiTree T) // 中序非递归算法2
{
stack<BiTree> s;
BiTree p = T;
while(p || !s.empty())
{
if(p) //根指针进栈,遍历左子树
{
s.push(p);
p = p -> lchild;
}
else //根指针退栈,访问根结点,遍历右子树
{
p = s.top();
s.pop();
if(!p)
exit(overflow);
cout << p -> data << " ";
p = p -> rchild;
}
}
}*/
int main()
{
BiTree T;
InitBiTree(T); //初始化
CreateBiTree(T); //创造一个树
InOrder(T); cout << endl;
cout << " 先序:"; PreOrderTraverse(T); cout << endl; //先序遍历
cout << " 中序:"; InOrderTraverse(T); cout << endl; //中序遍历
cout << " 后序:"; PostOrderTraverse(T); cout << endl; // 后序遍历
BiTree t = Findmode(T,'B'); //找到值为 B 的结点
if(t != NULL) // 如果找到了
{
if(t -> lchild != NULL) // 如果有左孩子
cout << "左孩子:" << t -> lchild -> data << endl;
if(t -> rchild != NULL) // 如果有右孩子
cout << "右孩子:" << t -> rchild -> data << endl;
}
int cnt = 0;
cout << "叶子结点都有:" ;
countleaf(T,&cnt); // 统计结点的个数
cout << "叶子结点的个数为:" << cnt << endl;
int depth = BiTreeDepth(T);
cout << "树的深度为:" << depth << endl;
cout << BiTreeEmpty(T) << endl;
BiTreeClear(T);
cout << BiTreeEmpty(T) << endl;
return 0;
}