剑指Offer-二叉搜索树的第k个结点

题目描述

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

思路

利用二叉搜索数中序遍历有序的特点。

用递归和迭代分别实现中序遍历。

代码实现

package Tree;

import java.util.Stack;

/**
 * 二叉搜索树的第k个结点
 * 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
 * 思路:
 * 利用二叉搜索数中序遍历有序的特点。
 */
public class Solution49 {
    private int cnt;
    private TreeNode res;

    /**
     * 迭代中序遍历
     *
     * @param pRoot
     * @param k
     * @return
     */
    TreeNode KthNode_2(TreeNode pRoot, int k) {
        if (pRoot == null || k == 0)
            return null;
        int cnt = 0;
        Stack<TreeNode> stack = new Stack<>();
        while (pRoot != null || !stack.isEmpty()) {
            while (pRoot != null) {
                stack.push(pRoot);
                pRoot = pRoot.left;
            }
            pRoot = stack.pop();
            cnt++;
            if (cnt == k) return pRoot;
            pRoot = pRoot.right;
        }
        return null;
    }

    TreeNode KthNode(TreeNode pRoot, int k) {
        inOrder(pRoot, k);
        return res;
    }

    /**
     * 递归中序遍历
     *
     * @param pRoot
     * @param k
     */
    void inOrder(TreeNode pRoot, int k) {
        if (pRoot == null) return;
        if (cnt > k) return;
        inOrder(pRoot.left, k);
        cnt++;
        if (cnt == k) res = pRoot;
        inOrder(pRoot.right, k);
    }

    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }

    }
}

posted @ 2018-04-17 15:30  武培轩  阅读(368)  评论(0编辑  收藏  举报