练习题
根据输入构建一个二叉树。
输入
第一行为树的根结点,从第二行开始,每行有三个字符,第一个字符是第三个字符的父结点。中间字符为L时表示第三个字符是第一个字符的左子树,R表示右子树。输入以0结束。
输出
该二叉树的先、中、后和层次遍历,最后输出树的深度。
#include<iostream>
#include<fstream>
#include<malloc.h>
#include<queue>
using namespace std;
ifstream stream("input.txt");
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
void findparentandCreate(BiTree &T,char parent,char ch,char child)
{
if(T) /* T不空 */
{
if(T->data != parent)
{
findparentandCreate(T->lchild,parent,ch,child);
findparentandCreate(T->rchild,parent,ch,child);
}
else
{
switch(ch){
case 'l':
case 'L':
T->lchild=(BiTree)malloc(sizeof(BiTNode));
if(!T->lchild)
exit(1);
T->lchild->data=child; /* 生成根结点 */
T->lchild->lchild = NULL;
T->lchild->rchild = NULL;
return;
case 'r':
case 'R':
T->rchild=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->rchild->data=child; /* 生成根结点 */
T->rchild->lchild = NULL;
T->rchild->rchild = NULL;
return;
}
}
}
}
void CreateBiTree(BiTree &T)// *T = t
{
char parent,ch,child;
T=(BiTree)malloc(sizeof(BiTNode));
stream>>T->data; /* 生成根结点 */
T->lchild = NULL;
T->rchild = NULL;
while(stream>>parent&&!stream.eof())
{
if(parent!='0')
{
stream>>ch>>child;
findparentandCreate(T,parent,ch,child);
}//if
else{ return ;}
}//while
}
void PreOrderTraverse(BiTree T)
{
if(T) /* T不空 */
{
cout<<T->data;
PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}
}
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild); /* 先中序遍历左子树 */
cout<<T->data; /* 再访问根结点 */
InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}
}
void PostOrderTraverse(BiTree T)
{
if(T) /* T不空 */
{
PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */
PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */
cout<<T->data; /* 最后访问根结点 */
}
}
void LevelOrderTraverse(BiTree T)
{
queue<BiTree>q;
BiTree a;
if(T)
{
q.push(T);
while(!q.empty())
{
a=q.front();
q.pop();
cout<<a->data;
if(a->lchild!=NULL)
q.push(a->lchild);
if(a->rchild!=NULL)
q.push(a->rchild);
}
printf("/n");
}
}
int BiTreeDepth(BiTree T)
{ /* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */
int hl=0,hr=0,max=0;
if(T!=NULL)
{ hl=BiTreeDepth(T->lchild);
hr=BiTreeDepth(T->rchild);
max=hl>hr?hl:hr;
return max+1;
}
else{ return 0;}
}
void main()
{
BiTree T;
CreateBiTree(T);
PreOrderTraverse(T);
cout<<endl;
InOrderTraverse(T);
cout<<endl;
PostOrderTraverse(T);
cout<<endl;
LevelOrderTraverse(T);
int depth=BiTreeDepth(T);
cout<<depth-1 <<endl;
}
输入样例 输出样例
A ABDGCEHFI
A L B DGBAHECFI
A R C GDBHEIFCA
B L D ABCDEFGHI
D R G 3
C L E
C R F
E L H
F R I
0