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 }

  • 相关阅读:
    数据库与数据仓库的比较Hbase——Hive
    log4j 配置使用
    hadoop Datanode Uuid unassigned
    kafka相关文章引用
    kafka可靠性
    kafka基本原理
    html
    并发编程
    Python之系统交互(subprocess)
    网络编程
  • 原文地址:https://www.cnblogs.com/ldjhust/p/2994318.html
Copyright © 2011-2022 走看看