完美平衡树中的元素顺序

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 structtypedef 不是必需的。 【参考方案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 我建议丢弃该函数并编写自己的二叉树构建器,可以理解。 是的,我首先想到了,遗憾的是我必须为考试学习这个,因为它是必需的。谢谢你:)

以上是关于完美平衡树中的元素顺序的主要内容,如果未能解决你的问题,请参考以下文章

AVL树完美平衡问题

数据结构AVL

数据结构AVL

LeetCode 230. 二叉搜索树中第K小的元素 (平衡树)

平衡树AVL树

平衡多路查找树中的多路是什么意思