【问题标题】:Level order insertion in binary tree二叉树中的级别顺序插入
【发布时间】:2012-10-21 14:59:51
【问题描述】:

我们要在二叉树中逐级插入元素,也就是数组:

a = {1,2,3,4,5,6}

1st level = [1]
2nd level = [2, 3]
3rd level = [4, 5, 6]

我已经制定了一个代码,但它每次都会导致 NULL 树。

struct node
{
    int data;
    struct node* left;
    struct node* right;
};

node* create(int x)
{
    node* tmp;
    tmp=(struct node *)malloc(sizeof(struct node));
    tmp->data=x;
    tmp->left=NULL;
    tmp->right=NULL;
    return tmp;
}

struct node* tree;

void insert(struct node* tree, int* a, int start, int n)
{
    int left =2*start+1;
    int right=2*start+2;
    if(left>n || right>n)
        return;
    if(tree==NULL)
    {
        tree=create(a[start]);
    }
    if(tree->left==NULL && tree->right==NULL)
    {
        if(left<n)
            tree->left=create(a[left]);
        if(right<n)
            tree->right=create(a[right]);
    }
    insert(tree->left,a,left,n);
    insert(tree->right,a,right,n);
}

【问题讨论】:

  • 您使用什么语言? (它可能应该是一个标签,并在您的问题中提到。)
  • 调用 insert( ) 以插入传入值的代码在哪里?

标签: c++ tree binary-tree insertion


【解决方案1】:

您正在按值传递tree;在insert 返回后,调用insert 的人仍然有一个NULL 指针。有关背景信息,请参阅What's the difference between passing by reference vs. passing by value?

【讨论】:

  • 我尝试使用双指针,但它并没有解决我的问题。
  • 您在尝试使用双指针时对代码做了哪些具体更改?
  • 在 'insert' 函数中用 '*tree' 替换了所有的 'tree' 实例,通过引用传递树并用 'insert(&((*tree)->left),a 替换递归调用,左,n);插入(&((*tree)->right),a,right,n);
  • 嗯,这听起来确实是正确的替代品,所以当你尝试它时它不起作用有点神秘。我们可能需要在上下文中查看插入的调用者,以及您用来测试最后是否拥有正确树的任何代码。我还建议使用调试器在程序运行时检查变量的值,或者至少检查printf 键值,以确定树何时变得未引用。
  • 原来我放错了括号之一。现在效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 2021-03-17
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2017-08-01
相关资源
最近更新 更多