我一直在练习一些旧的C ++问题,为一些求职面试做准备,我目前正试图从数组中递归构造一个二叉树,然后以递归的方式打印它。但是,在尝试输出结果时,我得到了一些奇怪的值。
问题:从数组[4,2,5,1,3]构造二叉树,然后创建一个打印
的函数
它们是递归的。
答案:我能够打印结果,但是我的解决方案包含一些意外的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 ++和递归有点生疏......我希望你们能帮帮我。谢谢
答案 0 :(得分:4)
问题在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
超出范围也是如此。
答案 1 :(得分:2)
node *tmp = null;
if(num < SIZE)
{
tmp= new node();
......
}
return tmp;
答案 2 :(得分:1)
你还有另外一个问题。您对树进行排序的算法在很大程度上取决于您访问数据的顺序。
尝试解决方案int data[SIZE] = {5, 4, 3, 2, 1};