zoukankan      html  css  js  c++  java
  • 必备算法之二叉树的相关操作

    树的结构定义如下

    1 typedef struct TNode *Position;
    2 typedef Position BinTree;
    3 struct TNode{
    4     ElementType Data;
    5     BinTree Left;
    6     BinTree Right;
    7 };

    1、求树的高度

     1 int GetHeight( BinTree BT )
     2 {
     3     int h=0;
     4     int hl,hr;
     5     if( !BT)
     6     {
     7         h = 0;
     8     }
     9     else
    10     {
    11         hl = GetHeight(BT->Left);  //左子树高度
    12         hr = GetHeight(BT->Right); //右子树高度
    13         if( hl>hr)
    14         {
    15             h = hl+1;
    16         }
    17         else
    18         {
    19             h = hr+1;
    20         }
    21     }
    22 
    23     return h;
    24 }

    2、树的先序遍历

    1 void PreorderTraversal( BinTree BT )
    2 {
    3     if( BT==NULL )
    4         return;
    5 
    6     printf(" %c",BT->Data);
    7     PreorderTraversal(BT->Left);
    8     PreorderTraversal(BT->Right);
    9 }

    3、树的中序遍历

    1 void InorderTraversal( BinTree BT )
    2 {
    3     if( BT==NULL )
    4         return;
    5 
    6     InorderTraversal(BT->Left);
    7     printf(" %c",BT->Data);
    8     InorderTraversal(BT->Right);
    9 }

    4、树的后序遍历

    1 void PostorderTraversal( BinTree BT )
    2 {
    3     if( BT==NULL )
    4         return;
    5 
    6     PostorderTraversal(BT->Left);
    7     PostorderTraversal(BT->Right);
    8     printf(" %c",BT->Data);
    9 }

    5、树的层次遍历

     1 void LevelorderTraversal( BinTree BT )
     2 {
     3     if(BT==NULL)
     4         return ;
     5         
     6     BinTree T[100];
     7     int i=0,j=0;
     8     T[j++]=BT;
     9     while(i<j)
    10     {
    11         BinTree s=T[i];
    12         printf(" %c",s->Data);
    13         if(s->Left)
    14             T[j++]=s->Left;
    15         if(s->Right)
    16             T[j++]=s->Right;
    17         i++;
    18     }
    19 }

     6.树的还原——已知先序中序

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 
     5 typedef struct TNode
     6 {
     7     char data;
     8     struct TNode *lchild,*rchild;
     9 } TNode,*Tree;
    10 
    11 Tree CreatTree( char xian[],char zhong[],int n);
    12 int GetHigh( Tree t);
    13 
    14 char xian[55];   //先序序列
    15 char zhong[55];  //中序序列
    16 int n;
    17 
    18 int main()
    19 {
    20     scanf("%d",&n);
    21     scanf("%s",xian);
    22     scanf("%s",zhong);
    23     Tree tree = CreatTree( xian,zhong,n);
    24     printf("%d",GetHigh(tree));
    25     return 0;
    26 }
    27 
    28 Tree CreatTree( char xian[],char zhong[],int n)
    29 {
    30     if( n==0 ) return NULL;
    31     int index = 0;
    32     Tree temp = (Tree) malloc(sizeof(struct TNode));
    33 
    34     while( index < n)
    35     {
    36         if( zhong[index]==xian[0]) break;
    37         index ++;
    38     }
    39     temp->data = xian[0];
    40     temp->lchild = CreatTree(xian+1,zhong,index);
    41     temp->rchild = CreatTree(xian+1+index,zhong+index+1,n-index-1);
    42     return temp;
    43 }

       树的还原——已知中序后序

     1 BinTree Creathou( char zhong[],char hou[],int n)
     2 {
     3     if( n==0 ) return NULL;
     4     int index=0;
     5     BinTree temp;
     6     temp=( BinTree)malloc(sizeof(struct Node));
     7     while( index<n)
     8     {
     9         if( zhong[index]==hou[n-1])
    10             break;
    11         index++;
    12     }
    13     temp->data = hou[n-1];
    14     temp->left = Creathou( zhong,hou,index);
    15     temp->right = Creathou(zhong+index+1,hou+index,n-index-1);
    16     return temp;
    17 }
    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    结构化思考力
    对象序列化解析
    单元测试的规范
    关于CefSharp的坎坷之路
    构建基于Chromium的应用程序
    C# 面向切面编程(AOP)--监控日志记录方案
    CefSharp 中断点 已达到中断点
    用批处理命令实现激活office2016
    Winform开发中的困境及解决方案
    VUE+Element 前端应用开发框架功能介绍
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8323641.html
Copyright © 2011-2022 走看看