我想知道如果BST的每个节点都是如此,我怎样才能将BST转换为O(nlogn)时间的avl:
struct node{
int leftHeight;
int rightHeight;
struct node* lr;
struct node* rc;
}
我是否必须访问bst的每个节点以检查余额是否不同于0,1,-1?如果是这样,我必须检查它是右或左孩子,以便我分别进行左或右旋转?我怎么做?
我用C. 请不要判断我是初学者。
答案 0 :(得分:0)
所以你有一个二进制搜索树,你想将它转换为平衡搜索树(AVL树),并想知道是否可以在O(n.log(n))中完成。
在快速研究之后,一般的方法是在构建树时保持树的平衡。另一种方法是创建一个平衡的新树(使用AVL算法)。
要在就地平衡树,您可以使用我在另一个Stack Overflow问题Stout-Warren algorithm中找到的引用Balancing a binary search tree。
引用的文章指出其程序在线性时间内工作,即O(n)小于O(n.log(n))。