#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef int TreeData;
typedef struct node{
TreeData data;
struct node * leftChild,* rightChild;
}BinTreeNode;//二叉树结点
typedef BinTreeNode* BinTree;
void PreOrder(BinTree T){
if(T!=NULL){
cout << T->data << " " ;
PostOrder(T->leftChild);
PostOrder(T->rightChild);
}
}//前序遍历
void InOrder(BinTree T){
if(T!=NULL){
PostOrder(T->leftChild);
cout << T->data << " " ;
PostOrder(T->rightChild);
}
}//中序遍历
void PostOrder(BinTree T){
if(T!=NULL){
PostOrder(T->leftChild);
PostOrder(T->rightChild);
cout << T->data << " " ;
}
}//后续遍历
bool PreCreateBiTree(BinTree &T){
int value;
cin >> value;
if(value==-1) T=NULL;
else{
if(!(T=(BinTree)malloc(sizeof(BinTreeNode))))
return false;
T->data=value;
PreCreateBiTree(T->leftChild);
PreCreateBiTree(T->rightChild);
}
return true;
}//由前序遍历重构二叉树(条件是空结点值为-1)
BinTree Copy(BinTree T){
if(T==NULL) return NULL;
BinTree NewNode;
if(!(NewNode=(BinTree)malloc(sizeof(BinTreeNode))))
return 0;
NewNode->data=T->data;
NewNode->leftChild=Copy(T->leftChild);
NewNode->rightChild=Copy(T->rightChild);
return NewNode;
}//复制二叉树
int NodeNumber(BinTree T){
if(!T) return 0;
else return 1+NodeNumber(T->leftChild)+NodeNumber(T->rightChild);
}//计算节点个数(法1)
void CountNode(BinTree T,int n){
if(T){
n++;
CountNode(T->leftChild,n);
CountNode(T->rightChild,n);
}
}//计算节点个数(法2)
int Leaf_Count(BinTree T){
if(!T) return 0;
else if(!T->leftChild&&!T->rightChild)return 1;
else return Leaf_Count(T->leftChild)+Leaf_Count(T->rightChild);
}//求叶子节点个数
int Height(BinTree T){
if(T==NULL) return 0;
else{
int l=Height(T->leftChild);
int r=Height(T->rightChild);
return(l>r)?l+1:r+1;
}
}//求二叉树的高度
int FindIndex(int In[],int InStart,int InEnd,int data){
for(int i=InStart;i<InEnd+1;i++)
if(In[i]==data)
return i;
return -1;
}//查找相应数值在中序遍历的下标
BinTree Pre_In_ReCreateTree(int Pre[],int In[],int PreStart,int PreEnd,int InStart,int InEnd){
BinTree root;
if(PreStart>PreEnd || InStart>InEnd)
root=NULL;
root->data=Pre[PreStart];
int r=FindIndex(In,InStart,InEnd,Pre[PreStart])-InStart;
root->leftChild=Pre_In_ReCreateTree(Pre,In,PreStart+1,PreStart+r,InStart,InStart+r-1);
root->rightChild=Pre_In_ReCreateTree(Pre,In,PreStart+r+1,PreEnd,InStart+r+1,InEnd);
return root;
}//由前序遍历和中序遍历重构二叉树
BinTree Post_In_ReCreateTree(int Post[],int In[],int PostStart,int PostEnd,int InStart,int InEnd){
BinTree root;
if(PostStart>PostEnd || InStart>InEnd)
root=NULL;
root->data=Post[PostEnd];
int r=FindIndex(In,InStart,InEnd,Post[PostEnd])-InStart;
root->leftChild=Post_In_ReCreateTree(Post,In,PostStart,PostStart+r-1,InStart,InStart+r-1);
root->rightChild=Post_In_ReCreateTree(Post,In,PostStart+r,PostEnd-1,InStart+r+1,InEnd);
}//由后序遍历和中序遍历重构二叉树
int main()
{
}