#include<iostream>
using namespace std;
//定义节点
typedef struct node
{
struct node *lchild;
struct node *rchild;
int data;
}BiTreeNode, *BiTree; //*BiTree的意思是给 struct node*起了个别名,叫BiTree,故BiTree为指向节点的指针。
//按照前序顺序建立二叉树
void createBiTree(BiTree &T) //&的意思是传进来节点指针的引用,括号内等价于 BiTreeNode* &T,目的是让传递进来的指针发生改变
{
int c;
cin >> c;
if(0 == c) //当遇到#时,令树的根节点为NULL,从而结束该分支的递归
T = NULL;
else
{
T = new BiTreeNode;
T->data=c;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
bool judgeSortT(BiTree T)//判断是否为排序树
{
bool lj;
if(!T)
return 1;
lj=judgeSortT(T->lchild);//左子树判断
if(T->lchild && T->lchild->data>T->data)
lj=0;
if(T->rchild && T->data>T->rchild->data)
lj=0;
return lj && judgeSortT(T->rchild);//T的左子树及其当前结点T均符合要求则对右子树进行判断
}
void dispLeaf(BiTree T,int lev)//显示叶子结点
{
if(T)
{
dispLeaf(T->lchild,lev+1);
if(!T->lchild && !T->rchild)
cout<<T->data<<'\t'<<lev<<endl;
dispLeaf(T->rchild,lev+1);
}
}
//前序遍历二叉树并打印
void preTraverse(BiTree T)
{
if(T)
{
cout<<T->data<<" ";
preTraverse(T->lchild);
preTraverse(T->rchild);
}
}
//中序遍历二叉树并打印
void midTraverse(BiTree T)
{
if(T)
{
midTraverse(T->lchild);
cout<<T->data<<" ";
midTraverse(T->rchild);
}
}
//后续遍历二叉树并打印
void postTraverse(BiTree T)
{
if(T)
{
postTraverse(T->lchild);
postTraverse(T->rchild);
cout<<T->data<<" ";
}
}
int main()
{
BiTree T; //声明一个指向二叉树根节点的指针
createBiTree(T);
cout<<"二叉树创建完成!"<<endl;
// cout<<"前序遍历二叉树:"<<endl;
//preTraverse(T);
//cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
midTraverse(T);
cout<<"排序树"<<judgeSortT(T)<<endl;
dispLeaf(T,1);
// cout<<endl;
// cout<<"后序遍历二叉树:"<<endl;
// postTraverse(T);
return 0;
}