二叉搜索樹查找第K小的元素

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class Solution {

    /**
     * 查找第K小的元素
     */
    //中序遍歷
    public int kthSmallest(TreeNode root, int k) {
        LinkedList<TreeNode> stack = new LinkedList<>();
        while (root != null || !stack.isEmpty()) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }

            if (!stack.isEmpty()) {
                TreeNode node = stack.pop();

                if (--k == 0) {
                    return node.val;
                }

                root = node.right;
            }
        }

        return -1;
    }

    //中序遍歷遞歸
    public int kthSmallest2(TreeNode root, int k) {
        List<Integer> list = new ArrayList<>();
        inorder(list, root);
        return list.get(k - 1);
    }

    void inorder(List<Integer> l, TreeNode root) {
        if (root == null)
            return;
        inorder(l, root.left);
        l.add(root.val);
        inorder(l, root.right);
    }

    public int kthSmallest3(TreeNode root, int k) {
        int leftCount = nodeCount(root.left);
        if (leftCount + 1 == k) {
            return root.val;
        } else if (leftCount + 1 < k) {
            return kthSmallest(root.right, k - 1 - leftCount);
        } else {
            return kthSmallest(root.left, k);
        }
    }

    public int nodeCount(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return 1 + nodeCount(root.left) + nodeCount(root.right);
    }

    //dfs解法
    int count = 0;
    int result = 0;

    public int kthSmallest4(TreeNode root, int k) {
        dfs(root, k);
        return result;
    }

    public void dfs(TreeNode root, int k) {
        if (root == null) {
            return;
        }

        dfs(root.left, k);
        count++;
        if (count == k) {
            result = root.val;
            return;
        }
        dfs(root.right, k);
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章