如何用C++递归来查找BST中的根节点的inorder successor

小编觉得大家看到这个题目应该有点懵圈,我猜想大概是不知道什么是inorder successor吧!那现在小编就为大家排忧解难。这个inorder successor是这么翻译的中序的后继节点。什么意思呢?小编觉得吧,举个例子给大家看看,就应该能明白了。

比如,一棵二叉搜索树的中序遍历的结果是:6,10,11,12,13,13,15,15,17,22,34,72. 而假设根节点是12的话,那么这个根节点的后续节点就是13.这就是为什么叫做inorder successor了,其实就是利用了中序遍历的方法来查找有关inorder successor的。这里补充一点,当心大家有点忘记中序遍历的口诀了,口诀是“左根右”。

小编为大家解决了什么是inorder successor了,那现在咋们就直接进入代码环节:
下面是table.h文件

//This is the table.h file
#include<iostream>
#include<cstring>
#include<cctype>

using namespace std;

struct node
{
    int data;
    node * left;
    node * right;
};

class table
{
    public:
        //关于如何建立二叉搜索树,小编就不在这里展示代码了
        //直接展示有关解决这个问题的函数头
        //Find the root's inorder successor and return the item's data to main
        int find_root_inorder_successor();

    private:
        //Find the root's inorder successor and return the item's data to main
        int find_root_inorder_successor(node * root);

        node * root;
};

下面是table.cpp的代码展示,也就是如何实现这两个函数

//This is the table.cpp
#include "table.h"

int table::find_root_inorder_successor()
{
    //这里解释一下
    //因为根据中序遍历的口诀,那么根节点的后续节点就处在根节点的右子树
    //所以就可以直接传root->right给recursive function
    return find_root_inorder_successor(root->right);
}

int table::find_root_inorder_successor(node * root)
{
    if(!root)
        return 0;
    if(!root->left)
        return root->data;
    //既然wrapper function已经将参数传到右子树了,那么为了找到根节点的后续节点,那么在递归调用的时候就只遍历左边就行了
    return find_root_inorder_successor(root->left);
}

下面就是展示在主函数里,如何调用这两个函数了

//This is the main.cpp file
#include "table.h"

int main()
{
    //Find the root's inorder successor and return the item's data to main
    table object;
    int result = object.find_root_inorder_successor();
    cout<<"The result is: "<<result<<endl;

    return 0;
}

下面就是结果的展示了:
这是结果展示

有可能大家有些看不懂这个结果,没事,小编会为大家解释的。
结果中的Level 1就是根节点,根据BST的规则,就可以知道这棵树是什么样子的了。然后输出的结果就是13了。

以后小编还会继续用C++来实现有关数据结构中的问题,敬请期待吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值