c,小于k的最大整数

时间:2014-09-29 09:40:03

标签: c data-structures tree binary-tree

给定一个数字和二叉树,找到节点中小于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.程序不起作用,我做错了什么?

3 个答案:

答案 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); }`