LeetCode 230 二叉搜索树中第K小的元素

LeetCode 230 二叉搜索树中第K小的元素

题目描述

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

image-20210928102945084

题目分析

本题需要求出二叉搜索树中的第K小元素,我们之前介绍过二叉搜索树的性质:二叉搜索树的中序遍历结果是整个树节点的升序排序序列

因此,我们可以借助中序遍历排完序后再找出其中第K小元素即可。

解决

方式1:递归中序遍历

    public static int kthSmallest2(TreeNode root, int k)
    {
        ArrayList<Integer> res = inOrder(root, new ArrayList<>());
        //由于从1开始计数,所以返回第K减1个元素即是第K小元素
        return res.get(k - 1);
    }

    /**
     * 中序遍历
     * @param root
     * @param list
     * @return
     */
    public static ArrayList<Integer> inOrder(TreeNode root, ArrayList<Integer> list)
    {
        //如果左子节点不为空,递归左孩子
        if (root.left != null)
        {
            inOrder(root.left, list);
        }
        //添加当前节点
        list.add(root.val);
        //如果右子节点不为空,递归右孩子
        if (root.right != null)
        {
            inOrder(root.right, list);
        }
        return list;
    }

方式2:迭代中序遍历

    public int kthSmallest(TreeNode root, int k)
    {
        //使用栈结构来保存遍历结果
        Stack<TreeNode> stack = new Stack<>();
        while (true)
        {
            //当前节点不为空,入栈
            while (root != null)
            {
                stack.add(root);
                //迭代左孩子
                root = root.left;
            }
            //弹出栈顶元素
            root = stack.pop();
            //当第k次弹出后即为第k小元素
            if (--k == 0)
            {
                return root.val;
            }
            //迭代右孩子
            root = root.right;
        }
    }

方式2图解:

QQ录屏20210928110558

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值