【问题标题】:c++ problem inorder printing binary tree recursivelyc++ 递归打印二叉树的问题
【发布时间】:2011-05-05 06:09:14
【问题描述】:

我一直在练习一些旧的 C++ 问题以准备一些工作面试,我目前正在尝试从数组中递归地构造一棵二叉树,然后也递归地按顺序打印它。但是,在尝试输出结果时,我得到了一些奇怪的值。

问题:从数组[4,2,5,1,3]构造二叉树,然后创建一个打印函数
它们递归地排序。

答案:我可以打印结果,但是我的解决方案包含一些意外的 0,这些 0 也会打印在结果中。我不知道那些 0 最终会如何出现在打印结果中..

这是我目前的打印结果(注意值之间不需要的 0):
0 1 0 2 0 3 0 4 0 5 0

这是我编写的 c++ 解决方案。 (只需复制粘贴并在您的编译器上运行):

#include <iostream>

using namespace std;

const int SIZE = 5;

struct node{
    node *leftBranch;
    node *rightBranch;
    int val;
};

int data[SIZE] = {4,2,5,1,3};
node* construct_tree(int);
void print_tree(node*);

node * construct_tree(int num){
    node *tmp = new node();
    if(num < SIZE){
        tmp->leftBranch = construct_tree(2*num + 1);
        tmp->val = data[num];
        tmp->rightBranch = construct_tree(2*num + 2);
    }
    return tmp;
}

int main(){
    node *tree = construct_tree(0);
    print_tree(tree);
    return 0;
}

void print_tree(node* tree){
    if(tree == NULL)
        return;
    print_tree(tree->leftBranch);
    cout<<tree->val<<" ";
    print_tree(tree->rightBranch);
}

我觉得我对 c++ 和递归有点生疏了。希望你们能帮助我。thx

【问题讨论】:

    标签: c++ recursion tree binary-tree


    【解决方案1】:

    问题出在construct_tree。对它的调用是:

    construct_tree(0) -- from main()
        construct_tree(1)
            construct_tree(3)
                construct_tree(7)
                construct_tree(8)
            construct_tree(4)
                construct_tree(9)
                construct_tree(10)
        construct_tree(2)
            construct_tree(5)
            construct_tree(6)
    

    问题是,每次调用到construct_tree都会创建一个新节点并添加到你的树中,即使num超出范围。

    【讨论】:

    • 换句话说,如果我们认为construct_tree应该在num &gt;= SIZE时失败,我们会惊奇地发现当前代码仍然会分配new node(),将其返回给调用者, 调用者会将其分配给tmp-&gt;leftBranchtmp-&gt;rightBranch (有效地添加了一个尚未初始化的孩子)。为了修复这个错误,construct_tree 需要一种方法来向其调用者发出故障信号。
    • 它可以只返回null。然后父节点将在正确的子槽中拥有null
    • 和 @rwong :感谢您的快速回复。你们提出了很好的观点:)
    【解决方案2】:

    泰德是对的。尝试按如下方式更改construct_tree:-
    node *tmp = null;
    if(num < SIZE)
    {
    tmp= new node();
    ......
    }
    return tmp;

    【讨论】:

      【解决方案3】:

      你还有一个问题。您对树进行排序的算法高度依赖于您访问数据的顺序。在

      上尝试您的解决方案
      int data[SIZE] = {5, 4, 3, 2, 1};
      

      【讨论】:

      • 我不这么认为。在 OP 的代码中,每个节点及其两个子节点的内容分别由num2*num+12*num+2 确定,即不是由节点创建的顺序决定的。 (这种安排导致binary heap。)
      • @rwong 实际上我认为@djna 的假设是正确的。你是对的 2*num+12*num+2 作为参数传递给递归 construct_tree() 调用,但它们的值被用作访问数据数组的索引。所以数组中数据的顺序决定了树的结构,而不是它们的实际值。
      • 在 OP 的“面试问题”中,数组中的值可能是面试官选择的,这样当树以二叉堆的样式构造时,该树的按序遍历将结果为1 2 3 4 5。 (不过,OP 没有提到面试官对树的构造有什么规范。)
      • 我同意你的看法。在您的情况下,2 将是根节点,随后的左子树将包含 4(根)、5(左)、3(右),右子树将包含 1。我认为一种解决方法是构建一个树插入函数,在插入之前将新元素的值与当前根进行比较..@rwong:我实际上自己选择了这样的值,以便将其打印为 1 2 3 4 5 inorder :)
      猜你喜欢
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 2011-07-24
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多