zoukankan      html  css  js  c++  java
  • 二叉树的常见操作

    【输出二叉树中的叶子结点】

    无论前序、中序、后序遍历,叶子结点的输出顺序都是一样的吗??都是一样的,输出顺序为:从树的左边到右边叶子!!在二叉树的遍历算法中增加检测结点的“左右子树是否都为空”。

     1 void PreOrderPrintLeaves(BinTree Bt)
     2 {
     3     if(Bt)
     4     {
     5         if(Bt->Left == NULL && Bt->Right == NULL)
     6             printf("%c ", Bt->Data);
     7         PreOrderPrintLeaves(Bt->Left);
     8         PreOrderPrintLeaves(Bt->Right);
     9     }
    10 }
    11 
    12 void InOrderPrintLeaves(BinTree Bt)
    13 {
    14     if(Bt)
    15     {
    16         InOrderPrintLeaves(Bt->Left);
    17         if(Bt->Left == NULL && Bt->Right == NULL)
    18             printf("%c ", Bt->Data);
    19         InOrderPrintLeaves(Bt->Right);
    20     }
    21 }
    22 
    23 void PostOrderPrintLeaves(BinTree Bt)
    24 {
    25     if(Bt)
    26     {
    27         PostOrderPrintLeaves(Bt->Left);
    28         PostOrderPrintLeaves(Bt->Right);
    29         if(Bt->Left == NULL && Bt->Right == NULL)
    30             printf("%c ", Bt->Data);
    31     }
    32 }

    【求二叉树的叶子结点数】

    1 int BinTreeGetLeaves(BinTree Bt)
    2 {
    3     if(Bt == NULL)
    4         return 0;
    5     if(Bt->Left == NULL && Bt->Right == NULL)
    6         return 1;
    7     else
    8         return BinTreeGetLeaves(Bt->Left) + BinTreeGetLeaves(Bt->Right);
    9 }

    【求二叉树的高度】

     

     1 int PostOrderGetHeight(BinTree Bt)
     2 {
     3     int HL, HR, MaxH;
     4 
     5     if(Bt)
     6     {
     7         HL = PostOrderGetHeight(Bt->Left);
     8         HR = PostOrderGetHeight(Bt->Right);
     9         MaxH = (HL > HR) ? HL : HR;
    10         return (MaxH + 1);
    11     }
    12     else
    13     {
    14         return 0;
    15     }
    16 }

    【由两种遍历序列确定二叉树】

     已知三种遍历中的任意两种遍历序列,能否唯一确定一棵二叉树呢??必须要有中序遍历才行!!

    1、先序和中序遍历序列来确定一棵二叉树??

    • 根据先序遍历序列第一个结点确定根结点
    • 根据根结点中序遍历序列中分割左右两个子序列
    • 左子树右子树分别递归使用相同的方式继续分解;
     1 struct node
     2 {
     3     char data;
     4     struct node *lt, *rt;
     5 };
     6 
     7 // 用先序序列和中序序列建立二叉树
     8 struct node *create_by_pre_and_mid(int n, char *pre, char *mid)
     9 {
    10     struct node *root;
    11     int i;
    12 
    13     if(n==0)
    14         return NULL;
    15 
    16     root=(struct node *)malloc(sizeof(struct node));
    17     root->data=pre[0];
    18 
    19     for(i=0;i<n;i++) // 寻找左右子树的元素
    20         if(pre[0]==mid[i])
    21             break;
    22 
    23     root->lt = create_by_pre_and_mid(i, pre+1, mid); // 建立左子树
    24     root->rt = create_by_pre_and_mid(n-i-1, pre+i+1, mid+i+1); // 建立右子树
    25 
    26     return root;
    27 }

    2、后序和中序遍历序列来确定一棵二叉树??

    • 根据后序遍历序列最后一个结点确定根结点
    • 根据根结点中序遍历序列中分割左右两个子序列
    • 左子树右子树分别递归使用相同的方式继续分解;
     1 // 用后序序列和中序序列建立二叉树
     2 struct node *create_by_post_and_mid(int n, char *post, char *mid)
     3 {
     4     struct node *root;
     5     int i;
     6 
     7     if(n==0)
     8         return NULL;
     9 
    10     root=(struct node *)malloc(sizeof(struct node));
    11     root->data=post[n-1];
    12 
    13     for(i=0;i<n;i++) // 寻找左右子树的元素
    14         if(post[n-1]==mid[i])
    15             break;
    16 
    17     root->lt = create_by_post_and_mid(i, post, mid); // 建立左子树
    18     root->rt = create_by_post_and_mid(n-i-1, post+i, mid+i+1); // 建立右子树
    19 
    20     return root;
    21 }
  • 相关阅读:
    PHP 开发 APP 接口--读取缓存方式
    ABAP内表数据和JSON格式互转
    ABAP实现屏幕自己刷新和跳转功能
    让ABAP开发者愈加轻松的若干快捷键
    ABAP游标的使用
    根据工号获取姓名
    SAP(ABAP) 显示等待图标的FM:SAPGUI_PROGRESS_INDICATOR-SAP进度条
    SAP GUI的配置文件
    条形码的编码规则
    JMeter 压测Server Agent无法监控资源问题,PerfMon Metrics Collector报Waiting for sample,Error loading results file
  • 原文地址:https://www.cnblogs.com/utank/p/4272409.html
Copyright © 2011-2022 走看看