【问题标题】:Order of elements in perfectly balanced tree完美平衡树中的元素顺序
【发布时间】:2017-02-14 15:06:59
【问题描述】:

我很难想象我的程序将如何插入元素。 这是老师给我们的代码:

int arr[] = { 3, -2, 11, 7, 12, 1, 4, 5, 33, 13 };
int n = 10;
int cnt = 0;

typedef struct node*po;

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

po ibd(int n) {
    po holder;
    if (n>0) {
        int nl = n / 2;
        int nr = n - nl - 1;
        holder = new node;
        holder->data = arr[cnt++];
        holder->left = ibd(nl);
        holder->right = ibd(nr);
        return holder;
    }
    else {
        return NULL;
    }
}

很遗憾,我无法理解和想象它是如何将元素放入树中的。据我了解,它使用递归分治算法将数组分成两部分并添加元素,但是我无法理解哪个元素成为根。有人可以帮我想象一下插入所有内容后树的外观吗?

【问题讨论】:

  • 你应该用你的调试器单步调试代码,看看它做了什么。
  • 这个问题你应该考虑使用c标签,而不是c++标签。
  • 当老师的函数签名是po ibd(int n)你担心代码清晰的未来
  • @FrançoisAndrieux 不是真的,那里有一个new。但这是真的,这只是 C 的变相(以及 bad C)。
  • 顺便说一句,在 C++ 中,你不需要typedef structtypedef 不是必需的。

标签: c++ algorithm tree insertion-order


【解决方案1】:

在处理树时,我喜欢画一个像这样的节点:

+--------------+---------------+  
|            Data              |  
+--------------+---------------+  
|  Pointer to  |   Pointer to  |  
| left subtree | right subtree |  
+--------------+---------------+  

当我让一个节点指向另一个节点时,我使用从适当的leftright 指针指向新节点的箭头。这有助于我可视化这棵树。

有很多资源展示了如何绘制树。

绘制完树后,在添加新节点时按照箭头进行操作。

【讨论】:

  • 是的,我可以理解这一点以及如何绘制树,但是我在这个确切的例子中遇到了麻烦。假设我有数组:{ 3, -2, 11, 7, 12, 1, 4, 5, 33, 13 }。该函数的作用是将数组拆分为 2:n / 2 和 n - n/2 - 1。所以现在我有 2 个数组:{3, -2, 11, 7, 12, 1} 和 {4, 5, 33, 13}。但是,我不明白哪个元素成为我的根。是 1(5h 数组元素,因为 n/2 = 5),然后左右放置其他元素,还是我弄错了?如果有人给我画了这个当前的例子,我真的会理解它是如何工作的。
  • 根据这个说法:holder->data = arr[cnt++];,你的根数据是3,因为cnt是0,arr[0] == 3
  • 我建议丢弃该函数并编写自己的二叉树构建器,可以理解。
  • 是的,我首先想到了,遗憾的是我必须为考试学习这个,因为它是必需的。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2012-12-16
  • 2011-12-18
  • 2020-01-02
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多