qq_51517832 2021-06-17 18:40 采纳率: 66.7%
浏览 16
已采纳

简单的二叉树的操作代码

1.实现二叉树的2种构造方法(输入扩展二叉树的前序遍历序列构造二叉树和已知二叉树的前序、中序序列,构造此二叉树)

2.对二叉树进行前序、中序、后序和层次遍历;

4.求二叉树结点数、叶子结点和高度;

5.将二叉树所有结点的左右子树交换。

 

  • 写回答

2条回答 默认 最新

  • technologist_30 2021-06-17 18:51
    关注
    #include"iostream.h"
    #include"erchashu.h"
    //先序创建一个树
    void CreatTree(BiTree &T)
    {
               elemtype ch;
               cin>>ch;
    			   if(ch == '#')
                T = NULL;
               else
               {
                         if(!(T = new BiNode))//分配内存空间失败就退出
                                    exit(0);
                          T->data = ch;
                          CreatTree(T->lchild);
                          CreatTree(T->rchild);
    		   }
               
    }
     
    //先序遍历
    void PreOrderTree(BiTree T)
    {
               if(T)
               {
                          cout<<T->data;
                          PreOrderTree(T->lchild);
                          PreOrderTree(T->rchild);
               }
    }
    //中序遍历
    void InOrderTree(BiTree T)
    {
               if(T)
               {
                          InOrderTree(T->lchild);
                          cout<<T->data;
                          InOrderTree(T->rchild);
               }
    }
    //后序遍历
    void LastOrderTree(BiTree T)
    {
               if(T)
               {
                          LastOrderTree(T->lchild);
                          LastOrderTree(T->rchild);
                          cout<<T->data;
               }
    }
    //层次遍历
    void LevOrderTree(BiTree T)
    {
               BiTree temp[NUM];///开辟一个数组,用于按层次存放结点
               int i,j,t;
               if(T)
                          temp[0] = T;
               i=0; j=0;//j 是计算有几个结点
               while (temp[i] && i<=j)
               {//本来以0开始计数,现在全部为1
                          if(temp[i]->lchild)
                          {//递归左子树
                                     j++;
                                     temp[j] = temp[i]->lchild;
                          }
                          if(temp[i] ->rchild)
                          {//递归右子树
                                     j++;
                                     temp[j] = temp[i]->rchild;
                          }
                          i++;
               }
    		   //结点全部都在这个数组里面
               for(t=0;t<=j;t++)
                cout<<temp[t]->data;
    }
    //计算深度
    int Depth(BiTree T)
    {
               if(T == NULL)
                          return 0;
               else
               {
                          int m = Depth(T->lchild);
                          int n = Depth(T->rchild);
                          return (m>n?m:n)+1;
               }
    }
    //计算结点个数
    int NodeCount(BiTree T)
    {
               if(T == NULL)
                          return 0;
               else
    			   return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
    }
    //计算叶子结点
    int LeafCount(BiTree T)
    {
               if(T==NULL)
                          return 1;
               
               else
                          return LeafCount(T->lchild)+LeafCount(T->rchild);
    }
     
    //交换左右子树
    void Swapchild(BiTree T)
    {
        BiTree t;
        if(T)
        {
            t=T->lchild;
            T->lchild=T->rchild;
            T->rchild=t;
            //交换左右子树的指针
     
            Swapchild(T->lchild);
            Swapchild(T->rchild);
        }
     
    }
     
    //主函数
    int main()
    {
    	       char e;
    		   char nil='#';//
    		   cout<<"欢迎使用本程序!"<<endl;
               cout<<"按先序输入一个二叉树(#结束):";
               BiTree Tre;
               CreatTree(Tre);
     
               cout<<"先序遍历结果为:";
               PreOrderTree(Tre);
               cout<<endl;
     
               cout<<"中序遍历结果为:";
               InOrderTree(Tre);
               cout<<endl;
     
               cout<<"后序遍历结果为:";
               LastOrderTree(Tre);
               cout<<endl;
     
               cout<<"层次遍历结果为:";
               LevOrderTree(Tre);
               cout<<endl;
               
               cout<<"二叉树的高度:"<<Depth(Tre)<<endl;
               
               cout<<"二叉树的结点数:"<<NodeCount(Tre)<<endl;
               
               cout<<"二叉树的叶子结点数:"<<LeafCount(Tre)/2<<endl;
     
    		   cout<<"二叉树的左右子树交换后的结果为:"<<endl;
    		   Swapchild(Tre);
               cout<<"先序遍历结果为:";
               PreOrderTree(Tre);
               cout<<endl;
     
               cout<<"中序遍历结果为:";
               InOrderTree(Tre);
               cout<<endl;
     
               cout<<"后序遍历结果为:";
               LastOrderTree(Tre);
               cout<<endl;
     
               cout<<"层次遍历结果为:";
               LevOrderTree(Tre);
               cout<<endl;
     
               return 0;
    }

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?