二叉树

来源:互联网 发布:手机测视力软件 编辑:程序博客网 时间:2024/05/16 08:51

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

原创粉丝点击