C 在O(h)时间复杂度下将二叉搜索树拆分为一半
我正在练习二进制搜索树,我必须回答一个问题: 树结构如下所示:C 在O(h)时间复杂度下将二叉搜索树拆分为一半,c,algorithm,data-structures,time-complexity,binary-search-tree,C,Algorithm,Data Structures,Time Complexity,Binary Search Tree,我正在练习二进制搜索树,我必须回答一个问题: 树结构如下所示: struct tree{ int key; int lcnt; struct tree *lc; struct tree *rc; }; 其中lcnt是一个整数,包含每个节点左子树上的节点数。问题是每次使用有效值更新lcnt时,将树一分为二。拆分算法必须花费时间,其中h是树的高度。我在下面找到了解决方案,它适用于大多数树木。但是现在考虑一下这棵树 170 /
struct tree{
int key;
int lcnt;
struct tree *lc;
struct tree *rc;
};
其中lcnt是一个整数,包含每个节点左子树上的节点数。问题是每次使用有效值更新lcnt时,将树一分为二。拆分算法必须花费时间,其中h是树的高度。我在下面找到了解决方案,它适用于大多数树木。但是现在考虑一下这棵树
170
/
45
\
30
结果将是:tree1:170,tree2:45。
我不知道如何修复它,因为如果我尝试类似“如果节点是叶子,则不分割”之类的操作,那么我在其他树上会遇到问题。split函数取参数root,它是主树的根,一个整数,它是trees length/2,它返回两棵新树。一个使用返回,另一个使用第三个参数双指针树进行引用。我还使用updt函数和一些计算来更新每次拆分时的lcnt
代码如下:
您的测试用例
170
/
45
\
30
不是有效的二进制搜索树
void updt(struct tree* root, int decrease){
struct tree *temp;
temp=root;
while(temp!=NULL){
temp->lcnt=temp->lcnt-decrease;
temp=temp->lc;
}
}
170
/
45
\
30