【问题标题】:Constructing a tree in C with only leaves, given a pre order sequence给定一个前序序列,在 C 中构造一棵只有叶子的树
【发布时间】:2017-03-23 19:27:37
【问题描述】:

我正在尝试构建一种特定类型的树,其中每个内部节点的数据都依赖于树的叶子。我有一个预购数组,pre[] = { 0,0,0,1,2,3,0,4,5}其中每个“0”代表一个内部节点,其他任何东西都代表叶子。如果我要构建这棵树,它会是这样的:

         0
      /     \
     0       0
    / \     / \
   0   3   4   5
  / \
 1   2

我在递归调用时遇到问题,特别是在 while 循环中。在我完成创建带有数据“2”的节点后,在我返回根节点后,我将留在它正上方的内部节点处。这个内部节点将继续在 while 循环中运行并弄乱我的树。如果我决定在条件语句末尾的 while 循环中放置一个返回根,那么构造将在填充树的左侧后停止。我该如何解决这个问题?

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <limits.h>
  4
  5 struct node
  6 {
  7         int data;
  8         int leafNode;
  9         struct node *left;
 10         struct node *right;
 11 };
 12
 14 struct node* newNode (int data){
 15         struct node* temp = (struct node *) malloc(sizeof(struct node));
 16         temp->data =data;
 17         temp->left = temp->right= NULL;
 18         return temp;
 19 }
 22 struct node* _constructTree( int pre[], int * preIndex, int low, int high, int size, int leaf){
 23         if (*preIndex >= size || low > high){
 24                 return NULL;}
 25
 26         printf("We are about to create this node: %d\n", pre[*preIndex]);
 27
 28         struct node* root = newNode(pre[*preIndex]);
 29         *preIndex = *preIndex + 1;
 30         if(leaf){
 31                 printf("Returning this leaf node: %d\n", pre[*preIndex - 1]);
 32                 return root;}
 33
 34
 35         if(low == high){
 36                 return root;}
 37
 38         while(low<high){
 39                 if(pre[*preIndex] == 0){
 40                 root->left = _constructTree(pre, preIndex, *preIndex, high, size, 0);}
 41
 42                 if(root->left == NULL){
 43                 root->left  = _constructTree(pre, preIndex, *preIndex, high, size, 1);
 44                 return root;
 45                 }
 46                 if(pre[*preIndex] != 0){
 47                 root->right = _constructTree(pre, preIndex, *preIndex, high, size, 1);
 48                 return root;
 49                 }
 50                 else{
 51                 root->right = _constructTree(pre,preIndex, *preIndex, high, size, 0);}
 52                         }
 53                 return root;
 54         }
 55 }
 56
 57 struct node * constructTree(int pre[], int size){
 58         int preIndex = 0;
 59         return _constructTree(pre, &preIndex, 0, size -1, size, 0);
 60         }
 61

【问题讨论】:

  • 你能依赖你的树节点总是有零个或两个子节点吗?也就是说,你需要容纳只有一个孩子的节点吗?
  • 开始一致地缩进你的代码,如果你不在问题中使用行号,不要发布带有行号的代码,最后但同样重要的是考虑发布minimal reproducible example
  • 每个内部节点都应该有两个子节点。
  • 贴出的代码无法编译,更别说重现问题了。
  • 我没有看到 lowhighleaf 参数的意义,也没有看到 while 循环的意义。

标签: c recursion binary-tree computer-science


【解决方案1】:

这样的东西行不通吗(稍微总结一下,但希望它能说明这个想法)?:

construct_tree(int pre[], int* index){
    root=pre[*index];
    *index++;
    if(root>0)return root;
    left=construct_tree(pre,index);
    right=construct_tree(pre,index);
    return root;
}

【讨论】:

  • 是的,看起来应该可以,但不要为他们做其他人的功课。它并没有真正帮助任何人。
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 2011-07-27
  • 2017-10-27
  • 1970-01-01
  • 2021-08-06
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多