二叉搜索树的第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 返回上一层; 递归调用结束。