zoukankan      html  css  js  c++  java
  • 知道前序和中序重建二叉树

        知道二叉树的前序和中序序列重建这颗二叉树,从最简单的开始,我们假设这两个序列的确是一颗二叉树的前序和中序序列并且这可二叉树中没有重复的节点:

      1 #include <stdio.h>
      2 #include <malloc.h>
      3 
      4 struct NODE 
      5 {
      6     int data;
      7 
      8     struct NODE *lChild;
      9     struct NODE *rChild;
     10 };
     11 
     12 // 重建二叉树,要求此二叉树中不能有重复的节点
     13 void RebuildBinaryTree(int *PreOrder, int n, int *InOrder, int m, struct NODE **root)
     14 {
     15     if ((NULL == PreOrder) || (n <= 0) || (NULL == InOrder) || (m <= 0) || (NULL == root))
     16     {
     17         printf ("Invalid Parameter(s)!\n");
     18         return;
     19     }
     20 
     21     // 前序中序长度一定是一样
     22     if (n != m)
     23     {
     24         printf ("Error! The length of PreOrder and InOrder are different!\n");
     25         return;
     26     }
     27 
     28     if (n > 0)
     29     {
     30         int i = 0;
     31 
     32         for (i = 0; i < m; ++i)
     33         {
     34             // 如果二叉树有重复的节点,则这这一步就有可能判断错误
     35             if (PreOrder[0] == InOrder[i])
     36             {
     37                 break;
     38             }
     39         }
     40 
     41         if (NULL == (*root = (struct NODE *)malloc(sizeof(struct NODE))))
     42         {
     43             printf ("Fail to malloc space for *root!\n");
     44             return;
     45         }
     46 
     47         (*root)->data = PreOrder[0];
     48 
     49         if (i > 0)
     50         {
     51             // 重建当前节点的左子树
     52             RebuildBinaryTree (PreOrder + 1, i, InOrder, i, &((*root)->lChild));
     53         }
     54         else
     55         {
     56             (*root)->lChild = NULL;
     57         }
     58 
     59         if (i < (m - 1))
     60         {
     61             // 重建当前节点的右子树
     62             RebuildBinaryTree (PreOrder + i + 1, n - 1 - i, InOrder + i + 1, m - 1 - i, &((*root)->rChild));
     63         }
     64         else
     65         {
     66             (*root)->rChild = NULL;
     67         }
     68     }
     69 }
     70 
     71 // 递归前序遍历
     72 void RecursionPreOrder(struct NODE *root)
     73 {
     74     if (NULL != root)
     75     {
     76         // 访问当前节点
     77         printf ("%d ", root->data);
     78 
     79         // 访问左子树
     80         RecursionPreOrder (root->lChild);
     81 
     82         // 访问右子树
     83         RecursionPreOrder (root->rChild);
     84     }
     85 }
     86 
     87 int main(void)
     88 {
     89     int PreOrder[] = {1, 2, 4, 5, 3, 6, 7};
     90     int InOrder[] = {4, 2, 5, 1, 6, 3, 7};
     91     struct NODE *root = NULL;
     92     // 重建二叉树
     93     RebuildBinaryTree (PreOrder, 7, InOrder, 7, &root);
     94 
     95     printf ("重建的二叉树的前序遍历序列为:\n");
     96     RecursionPreOrder (root);
     97     printf ("\n");
     98 
     99     return(0);
    100 }

  • 相关阅读:
    docker 会这些也够
    Linux 学会这些基本可以啦
    xxxxxxxxx
    Angular
    mongo
    node
    git clone 解决Permission Denied (publickey)问题
    vue项目如何刷新当前页面
    vue——动态路由以及地址传参
    vue 单页应用点击某个链接,跳转到新页面的方式
  • 原文地址:https://www.cnblogs.com/ldjhust/p/2994318.html
Copyright © 2011-2022 走看看