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