二叉树

练习题
根据输入构建一个二叉树。
输入
第一行为树的根结点,从第二行开始,每行有三个字符,第一个字符是第三个字符的父结点。中间字符为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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值