树的遍历、度、深度等相关实验

内容:

(1) 先序创建二叉树;

(2) 实现二叉树的先序递归遍历,按先序遍历的次序显示各结点的

(3) 实现二叉树的先序递归遍历,按先序遍历的次序显示各结点的

(4) 实现二叉树的中序递归遍历,按中序遍历的次序显示各结点的

(5) 实现二叉树的后序递归遍历,按后序遍历的次序显示各结点的

(6) 统计二叉树的结点数;

(7) 统计二叉树的叶结点数;

(8) 计算二叉树的深度;

(9) 销毁二叉树。

代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define OK 1
#define OVERFLOW -2
typedef int status;
int sum,du[100];
typedef struct BiTNode
{ // 结点结构
    char data;
    struct BiTNode  *lchild, *rchild; // 左右孩子指针
}BiTNode,*BiTree;
status CreateBiTree(BiTree &T)
{      //以先序方式构造二叉树
   char ch;
   cin>>ch;
   if (ch=='#') T=NULL;
   else
   { T=new(BiTNode);
     if(!T) exit(OVERFLOW);
     T->data=ch;
   T->lchild=T->rchild=NULL;
     CreateBiTree(T->lchild);
     CreateBiTree(T->rchild);
   }
   return OK;
}//CreateBiTree
void Preorder(BiTree T)
{ // 先序遍历二叉树
   if (T)
   {  cout<<T->data;       // 访问根结点
      Preorder(T->lchild);        //先序遍历左子树
      Preorder(T->rchild);        //先序遍历右子树
   }// if
} // Preorder
int Nodes(BiTree T)
{      //先序计算结点个数
   if (T==NULL) return 0;
   else  return (1+Nodes(T->lchild)+Nodes(T->rchild));
}// Nodes
bool Preorder_du(BiTree T)
{ // 先序遍历二叉树
   if (T)
   {
      int s = 0;
      if(Preorder_du(T->rchild))
        s++;        //先序遍历右子树
      if(Preorder_du(T->lchild))
        s++;        //先序遍历左子树
//遍历必须反过来才行,因为把结果放入了数组中再倒序输出,所以必须先遍历右子树
      du[sum++] = s;
      return true;
   }// if
   return false;
} // Preorder
bool Midorder(BiTree T)
{
    if(!T)
        return false;
    if(T->lchild)
        Midorder(T->lchild);
    cout << T->data;
    if(T->rchild)
        Midorder(T->rchild);
    return true;
}
bool Lastorder(BiTree T)
{
    if(!T)
        return false;
    if(T->lchild)
        Lastorder(T->lchild);
    if(T->rchild)
        Lastorder(T->rchild);
    cout << T->data;
    return true;
}
int NodeCount(BiTree T)
{
    if(!T) return 0;
    else
        return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int YeNodeCount(BiTree T)
{
    if(!T)
        return 0;
    if(!YeNodeCount(T->lchild)&&!YeNodeCount(T->rchild))
        return 1;
    else
        return YeNodeCount(T->lchild)+YeNodeCount(T->rchild);
}
int Depth(BiTree T)
{
    if(!T)
        return 0;
    else
    {
        int m = Depth(T->lchild);
        int n = Depth(T->rchild);
        if(m>n)
            return m+1;
        else
            return n+1;
    }
}
void xiaohui(BiTree T)
{
   if (T)
   {
      xiaohui(T->lchild);        //先序遍历左子树
      xiaohui(T->rchild);        //先序遍历右子树
      free(T);
   }// if
} // Preorder
int main()
{
  sum = 0;
  BiTree T;
  printf("1、请前序输入二叉树:" );
  if(CreateBiTree(T))
    printf("创建成功\n");
  printf("2、先序遍历二叉树的值:");
  Preorder(T);
  cout << endl;
  printf("3、先序遍历二叉树的度:");
  Preorder_du(T);
  for(int i = sum-1;i>=0;i--)
	  cout << du[i];
  cout <<endl;
  printf("4、中序遍历二叉树的值:");
  Midorder(T);
  cout << endl;
  printf("5、后序遍历二叉树的值:");
  Lastorder(T);
  cout << endl;
  printf("6、计算二叉树的结点数:%d\n",NodeCount(T));
  printf("7、计算二叉树的叶结点数:%d\n",YeNodeCount(T));
  printf("8、计算二叉树的深度:%d\n",Depth(T));
  xiaohui(T);
  printf("9、销毁成功");
  return 0;
}

错误反思:实验的时候太心急了(为了限时内完成能加分),没多试几个测试(太自信了)。计算度的时候出现了点bug,顺序出现了错误,我的想法是先保存在数组中,再倒叙输出,可这样的话左右子树就会反过来,所以遍历顺序应该是右-->左-->中而不是左-->右-->中。

猜你喜欢

转载自blog.csdn.net/mmmmmmmw/article/details/80148085
今日推荐