您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-15 16:13 295 查看
小编觉得大家看到这个题目应该有点懵圈,我猜想大概是不知道什么是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++来实现有关数据结构中的问题,敬请期待吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: