【剑指offer-JZ54】二叉搜索树的第k个节点

55 阅读1分钟
// 递归
public class Solution {
    int count = 0;

    TreeNode KthNode(TreeNode pRoot, int k) {
        if (pRoot == null || k == 0) {
            return null;
        }
        TreeNode node = KthNode(pRoot.left, k);
        if (node != null) return node;
        count++;
        if (count == k) return pRoot;
        node = KthNode(pRoot.right, k);
        if (node != null) return node;
        return null;
    }
}






// 非递归
public class Solution {

    TreeNode KthNode(TreeNode pRoot, int k) {
        if (pRoot == null || k == 0) return null;
        Stack<TreeNode> s = new Stack<>();
        TreeNode p = pRoot;
        while (p != null || !s.empty()) {
            if (p != null)     //遍历左子树,依次进栈
            {
                s.push(p);
                p = p.left;
            } else      //退栈,访问根节点。遍历右子树
            {
                k--;
                p = s.pop();
                if (k == 0) return p;
                p = p.right;
            }
        }
        return null;
    }
}


题源:www.nowcoder.com/practice/57…