题目描述
给定一棵二叉搜索树,请找出其中的第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++
...最终报错 空指针异常