alex122 2022-05-19 11:39 采纳率: 66.7%
浏览 54
已结题

模板类二叉搜索树的高度修正function

问题遇到的现象和发生背景

我现在遇到一个问题是关于二叉搜索树的高度修正, 不是AVL就是正常的二叉搜索树。

问题是当插入、删除运行的时候,二叉搜索树的高度会发生变化(下图可看) 那么这个fix_height的意义就在于,如何在这些一系列操作完成之后,依然维持住树的正确高度。

问题相关代码,请勿粘贴截图
    // This assumes that the subtrees rooted at node's children have   // 这里假设根节点
    // correct heights and then walks up the tree from node to the root 
    // correcting the heights.
    // You can imlement this, or correct the heights another way
    void fix_height(Node* node);


template <typename T>
int BST<T>:: getHieght(Node * node)
{   
    node = root_;
    if(node==nullptr)
    {
        return 0;
    }
    else 
    {
        return node->height;
        // int left_height = getHieght(node->left);
        // int right_height = getHieght(node->right); 
        // return max(left_height, right_height) + 1;
    }
    
}



 template <typename T>
void BST<T>:: fix_height(Node* node){
    //int height = 0;

    if(node==nullptr)
    {
     node->height=-1;
    }   
    else if(node->left==nullptr && node->right==nullptr)
    {
        node->height=0;
    }
    else
    {
        node->height=max(getHieght(node->left),getHieght(node->right))+1;
        
    }
运行结果及报错内容

运行结果就是Test没有通过,因为需要修正高度的function有插入,删除最小值,和右旋,这三个都没有过高度修正的测试
插入:a.out: unit_tests.hpp:101: void Tester::test_insert_heights(): Assertion `your_heights == real_heights' failed.

删除最小值:a.out: unit_tests.hpp:137: void Tester::test_delete_min_heights(): Assertion `your_heights == real_heights' failed.

右旋: a.out: unit_tests.hpp:342: void Tester::test_rotate_heights(): Assertion `your_heights == real_heights' failed.

删除 :a.out: unit_tests.hpp:218: void Tester::test_erase_heights(): Assertion `your_heights == real_heights' failed.

我的解答思路和尝试过的方法

我试图通过不同的情况来更新node的高度,像是如果node是root那么高度就会是-1,当node是leaf node(也就是没有子嗣的node)的时候就设高度为0,但结果都是错误的

我想要达到的结果

希望有哪位能解决我这个问题,如果不会这个function也没问题,另一种方法则是在插入function最后自己更新高度,其他function也是同理,但该如何更新我也不清楚,所以只能跟着这个例子走。

img

展开全部

  • 写回答

2条回答 默认 最新

  • togolife 2022-05-19 23:00
    关注
    template <typename T>
    int BST<T>::update_height(Node* node){
        if(node==nullptr)
        {
            return -1;
        }
        else if(node->left==nullptr && node->right==nullptr)
        {
            node->height=0;
            return 0;
        }
        else
        {
            node->height=max(update_height(node->left),update_height(node->right))+1;
            return node->height;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    alex122 2022-05-20 06:41

    我们的fix_height 是void,没办法return 0

    回复
    togolife 回复 alex122 2022-05-20 06:58

    
    void fix_height(Node* node)
    {
      update_height(node);
    }
    
    

    回复
    alex122 回复 togolife 2022-05-20 07:11

    另起炉灶啊,这么牛啊

    回复
    展开全部5条评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 已采纳回答 5月24日
  • 修改了问题 5月19日
  • 创建了问题 5月19日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部