给定一个数字和二叉树,找到节点中小于k的最大数字。
我使用的功能如下:
#include <stdio.h>
#include <stdlib.h>
//A binary tree with a pointer to the left and right child
struct node
{
int data;
struct node *left;
struct node *right;
};
// function to allocate new node
struct node* newNode(int data)
{
struct node* node = (struct node*)malloc(sizeof(struct node));
node->data = data;
node->left = node->right = NULL;
return (node);
}
int findNum (struct node* root, int K)
{
int val = K;
while( root )
if( root->data >= K )
root = root->left;
else{
val = root->data;
root = root->right;
}
return val;
}
int main()
{
struct node *root = newNode(9);
root->left = newNode(13);
root->right = newNode(10);
root->right->right= newNode(20);
root->left->left = newNode(8);
root->left->right = newNode(4);
root->right->right->left = newNode(3);
root->right->right->right = newNode(18);
printf("%d", findNum(root,21));
return 0;
}
这种情况下的输出应该是20,但它输出18.程序不起作用,我做错了什么?
答案 0 :(得分:2)
从构建树的main()
代码中,您的树看起来像:
9
/ \
13 10
/\ \
8 4 20
/\
3 18
这显然不是一个结构合理的二进制搜索树,它并不支持节点左边的节点应该小于它们的父节点的不变量,依此类推。因此,您的搜索代码(假定使用二叉搜索树)无法正常工作。
您当然可以修复初始化代码,但您也可以考虑为二叉搜索树实际实现insert()
,这样您就可以简化main()
中的代码。
答案 1 :(得分:0)
为什么你期望另一个值,当你在没有任何条件的情况下一直覆盖val变量时:
while( root )
if( root->data >= K )
root = root->left;
else{
val = root->data;
root = root->right;
}
在你的情况下,if(root-&gt; data&gt; = K)永远不会满足所以你去else语句,你只需要将值写入val变量并转到另一个&#34;右节点&# 34;,所以你将始终拥有右节点中的最后一个值。
答案 2 :(得分:0)
`static int result = INT.MIN; void foo(Node root,int k){
if(root == null)return;
if(root.value
FOO(root.left); FOO(root.right); }`