题目描述

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

解题思路

1,二叉搜索树的中序遍历是排序的,所以先进行中序遍历得到一个有序list
2,在该list里查找到第k个

代码

/** * */
package 二叉树;

import java.util.ArrayList;

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

    /** * void * * @param args */
    TreeNode IntKthNode(TreeNode pRoot, int k) {
        if(pRoot==null||k<=0){
            return null;
        }
        ArrayList<TreeNode> list = new ArrayList<TreeNode>();
        insort(pRoot, list);
        if(k>list.size()){     
            return null;
        }
        return list.get(k - 1);    //中序遍历后把第k个返回

    }

    /** * 中序遍历 void * * @param args */
    public void insort(TreeNode pRoot, ArrayList<TreeNode> list) {

        if (pRoot == null) {
            return;
        }
        insort(pRoot.left, list);
        list.add(pRoot);
        insort(pRoot.right, list);

    }

    public static void main(String[] args) {
        TreeNode pRoot = new TreeNode(5);
         pRoot.left = new TreeNode(3);
         pRoot.right = new TreeNode(7);
         pRoot.left.left = new TreeNode(2);
         pRoot.left.right = new TreeNode(4);
         pRoot.right.left = new TreeNode(6);
         pRoot.right.right = new TreeNode(8);
         KthNode k = new KthNode();
         int a = k.IntKthNode(pRoot, 3).val;
         System.out.println(a);
    }

}

易错点

一定要注意list和k的边界条件,k不能大于list的size也不能小于等于0