【发布时间】:2020-08-02 10:45:50
【问题描述】:
所以我正在阅读 Narasimha Karumanchi 所著的《轻松实现数据结构和算法》一书,其中给出了 bst sn-p 的底值 - BST 章中的第 61 题。 sn-p 让我非常困惑,现在我只想知道它是如何工作的: sn-p如下:
node* floorValue(node* root, node* prev ,int k)
{
if(!root){
return NULL;
}
if( !(floorValue(root->left , prev ,k))
{
return 0;
}
if(root->data == k)
{
return root;
}
if(root->data > k)
{
return prev;
}
prev = root;
return floorValue(root->right , prev , k);
}
在此,node* prev 以NULL 启动,用于存储前一个节点,int k 是我们要为其查找下限值的整数。
有人可以帮助我理解它的递归吗?我很困惑,因为:
1 .代码: if( !(floorValue(root->left , prev ,k)) { return 0; }
当树的最左边的元素被命中时将返回 0。但这会触发所有递归调用返回 0。
- 为什么当我们返回
node*而不是任何int时它返回 0
我们将不胜感激。我已经解决了这个问题,但它没有使用这种方法,而是一种更直接的方法(根据我的说法)。我想知道我做错了什么或者我在这段代码中遗漏了什么。
输入: 第一个输入将是节点数: 接下来的 n 行将是节点数据。 n 之后的第一个输入将是根值。
完整代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
node* left;
node* right;
};
node* insertBST(node* root , int x)
{
if(root==NULL)
{
node* root= new node;
root->data = x;
root->left = root->right = NULL;
return root;
}
else
{
if(x <root->data)
{
root->left = insertBST(root->left , x);
}
else
{
root->right = insertBST(root->right , x);
}
}
}
void inorder(node* root)
{
if(root)
{
inorder(root->left);
cout<<root->data<<" ";
inorder(root->right);
}
}
node* floorValue(node* root, node* prev ,int k)
{
if(!root){
return NULL;
}
if( !(floorValue(root->left , prev ,k))
{
return 0;
}
if(root->data == k)
{
return root;
}
if(root->data > k)
{
return prev;
}
prev = root;
return floorValue(root->right , prev , k);
}
int main()
{
int n;
cin>>n;
node *root = new node;
root = NULL;
for(int i = 0 ;i<n;i++)
{
int k;
cin>>k;
root= insertBST(root , k);
}
inorder(root);
cout<<"\nEnter the Value for which floor has to be searched : ";
int k;
cin>>k;
node* prev = NULL;
cout<<floorValue(root , prev, k);
return 0;
}
除了一些变量名之外,代码与书中给出的完全相同。
谢谢你,提前致谢。
【问题讨论】:
-
prev的初始值是多少?
-
@YashShah 它是 NULL。
-
“元素的底值”是什么意思?如果它只是二叉搜索树中的最小值,那只是在树上向左移动直到到达叶节点。
-
@PaulMcKenzie,我猜是这样的:对于具有元素 1、3、5、7 和给定值 4 的给定 BST,返回 3。
-
所以它基本上是一个中序遍历,并保存最后访问节点的值并将其与测试值进行比较。这就是它归结为的内容以及当前代码似乎在做什么。代码除了返回
NULL和0而不是nullptr等C++相关问题外,还有什么基本没被代码理解?
标签: c++ algorithm data-structures binary-search-tree