二叉搜索树的第K个节点
题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
递归解法
public class Solution {
TreeNode res = null;
int count;
TreeNode KthNode(TreeNode pRoot, int k)
{
if(k<=0 || pRoot==null)
return null;
count = k;
dfs(pRoot);
return res;
}
void dfs(TreeNode pRoot)
{
//(1)
if(count > 0 && pRoot.left != null){
dfs(pRoot.left);
}
//(2)
if(count==1)
res = pRoot;
//(3)
if(--count > 0 && pRoot.right!=null )
dfs(pRoot.right);
}
} 说明
此处Count使用全局变量,而不是作为函数的参数进行传递,是因为当前面的递归调用结束时,count值可能已经发生变化。
考虑下面一颗二叉树
5
3 7
2 4 6 8
中序遍历结果为 2 3 4 5 6 7 8 第3小节点值为4 递归调用过程如下:
1: (1)pRoot.val = 5 count = 3
2: (1)pRoot.val = 3 count = 3
3: (1)pRoot.val = 2 count = 3
3: (3)--count,count=2 pRoot.right==null 返回上一层
2: (3)--count,count=1 pRoot.right!=null 调用第一部分代码时count=3 第一部分代码调用结束时count=2;第三部分调用完后count=1;
4: (2)pRoot.val = 4, count = 1, res = pRoot; 找到结果。
4: (3)--count count=0 返回上一层;
2: 函数执行完 返回上一层;
1: (3) --count count= -2 返回上一层; 递归调用结束。

京公网安备 11010502036488号