树的形式比较多样
这儿只实现了一些常用操作
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
#include<vector>
#include<cstdlib>
#include<cctype>
using namespace std;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
int build(TNode T[])
{/*
由于树的建立形式特别多,这里以下面为例
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),
即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,
给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。
如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。
注意:题目保证每个结点中存储的字母是不同的。*/
int n,i;
char c1,c2;
scanf("%d",&n);
if(n==0)
return -1;
int vis[20];
memset(vis,0,sizeof(vis));
for(i=0; i<n; i++)
{
cin>>T[i].value>>c1>>c2;
if(c1=='-')
T[i].l=-1;
else
{
T[i].l=c1-'0';
vis[T[i].l]=1;
}
if(c2=='-')
T[i].r=-1;
else
{
T[i].r=c2-'0';
vis[T[i].r]=1;
}
}
for(i=0; i<n; i++)
if(vis[i]==0)
return i;//返回root的位置
}
int GetHeight( TNode BT )//返回树的高度
{
int l,r;
if(BT)
{
l=GetHeight(BT->Left);
r=GetHeight(BT->Right);
if(l>r)
return l+1;
else
return r+1;
}
return 0;
}
void InorderTraversal( TNode BT )//中序遍历
{
if(BT)
{
if(BT->Left)
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
if(BT->Right)
InorderTraversal(BT->Right);
}
}
void PreorderTraversal( TNode BT )//先序遍历
{
if(BT)
{printf(" %c",BT->Data);
if(BT->Left)
PreorderTraversal( BT->Left);
if(BT->Right)
PreorderTraversal( BT->Right);
}
}
void PostorderTraversal( TNode BT )//后序遍历
{
if(BT)
{
if(BT->Left)
PostorderTraversal( BT->Left);
if(BT->Right)
PostorderTraversal( BT->Right);
printf(" %c",BT->Data);
}
}
void LevelorderTraversal( TNode BT )//层次遍历
{
BinTree num[1000];
int l=0,r=0;
if(BT)
{
num[r]=BT;
r++;
while(l!=r)
{
printf(" %c",num[l]->Data);
l++;
if(BT->Left)
{
num[r]=BT->Left;
r++;
}
if(BT->Right)
{
num[r]=BT->Right;
r++;
}
BT=num[l];
}
}
}