完美平衡树中的元素顺序
Posted
技术标签:
【中文标题】完美平衡树中的元素顺序【英文标题】: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 struct
,typedef
不是必需的。
【参考方案1】:
在处理树时,我喜欢画一个像这样的节点:
+--------------+---------------+
| Data |
+--------------+---------------+
| Pointer to | Pointer to |
| left subtree | right subtree |
+--------------+---------------+
当我让一个节点指向另一个节点时,我使用从适当的left
或right
指针指向新节点的箭头。这有助于我可视化这棵树。
有很多资源展示了如何绘制树。
绘制完树后,在添加新节点时按照箭头进行操作。
【讨论】:
是的,我可以理解这一点以及如何绘制树,但是我在这个确切的例子中遇到了麻烦。假设我有数组: 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
。
我建议丢弃该函数并编写自己的二叉树构建器,您可以理解。
是的,我首先想到了,遗憾的是我必须为考试学习这个,因为它是必需的。谢谢你:)以上是关于完美平衡树中的元素顺序的主要内容,如果未能解决你的问题,请参考以下文章