二叉搜索树的第k个结点

本文介绍了如何在二叉搜索树中找到第k小的节点。通过中序遍历的方式,可以得到排序后的节点序列。在递归实现过程中,必须对每个递归调用的返回值进行判断,若找到符合条件的节点则返回,否则继续搜索。不进行此判断可能导致空指针异常。
摘要由CSDN通过智能技术生成

题目描述

给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4。

分析:

思路:

二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。

所以,按照中序遍历顺序找到第k个结点就是结果。参考:Echos

关于中序遍历:

public static void inTraverseBinTree(TreeNode node){
        if (node==null) {
            return;
        } 
        inTraverseBinTree(node.left);
        System.out.print(node.val+",");
        inTraverseBinTree(node.right); 

    }

 

必须要对每一个递归调用返回值进行判断if(node != null){return node;},判断返回值是否为null,如果为null就说明在没找到,要继续执行index++ ; if(index == k){...}的寻找过程,
如果返回不为空,则说明在递归调用判断子节点的时候已经找到符合要求的节点了,则将找到的节点逐层向上传递返回。直到返回到第一次调用KthNode的地方。
如果不对递归调用的返回值做判断,即不执行if(node != null){return node;},那所找到符合 要求的节点只能返回到上一层,不能返回到顶层。            牛客网 登远

                       

public class Test1 {
    int index =0;//计数器
    TreeNode KthNode(TreeNode pRoot, int k)
    {
        if(pRoot!=null){//中序遍历寻找第k个
            TreeNode node = KthNode(pRoot.left,k);
            if(node!=null)// 左子树中找到符合要求的节点返回
                return node;
            index++;// 从最左节点开始,index+1;
            if(index==k)
                return pRoot;
            node = KthNode(pRoot.right,k);
            if(node!=null)//左子树中没有找到,在右子树找到了符合要求的节点返回
                return node;
        }return null;//递归截止条件if(pRoot==null)

    }

    public static void main(String[] args) {
        TreeNode root=new TreeNode(5);

        root.left = new TreeNode(3);
        root.right = new TreeNode(7);

        root.left.left = new TreeNode(2);
        root.left.right = new TreeNode(4);

        root.right.left = new TreeNode(6);
        root.right.right = new TreeNode(8);
        Test1 test1 =new Test1();
        TreeNode  node1 =test1.KthNode(root,4);
        System.out.println(node1.val);

    }
}

为什么要有if(node != null) return node 这句话 ? 

图中解释的不够严谨,应该所找到之后 return node; 并退出方法;

如果不是return node,而是return  pNode ,则上层递归函数会继续,然后执行index++

...最终报错      空指针异常   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值