1. 程式人生 > >二叉搜尋樹第K小元素

二叉搜尋樹第K小元素

1.思路:迭代法

計算出二叉樹左節點的個數,如果左節點的個數等於k-1;則根節點就是我們要找的值,如果左節點的個數大於k-1,表明我們要查詢的第k個最小元素在左子樹中,如果左節點的個數小於k-1,表明要查詢的第k個最小元素在右子節點中,找到右子樹中第k-count(left)-1個元素就是我們要找的元素

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int kthSmallest(TreeNode root, int k) {
        /*
        迭代
        */
        int leftcon=count(root.left);
        if(leftcon==k-1) return root.val;
        if(leftcon>k-1) return  kthSmallest(root.left, k);
        return  kthSmallest( root.right, k-leftcon-1);
    }
    public int count(TreeNode root){
        if(root==null) return 0;
        return 1+count(root.left)+count(root.right);
    }
}

2.中序遍歷;中序遍歷二叉搜尋樹,排序是一個從小到大的陣列

class Solution {
    private int cnt=0;
    private int val;
    public int kthSmallest(TreeNode root, int k) {
       //中序遍歷
        inOrder(root,k);
        return val;
}
    public void inOrder(TreeNode node,int k){
        if(node==null) return;
        inOrder(node.left,k);
        cnt++;
        if(cnt==k){
            val=node.val;
            return;
        }
        inOrder(node.right,k);
    }
}