剑指offer——二叉搜索树的第k个结点

## 剑指offer——二叉搜索树的第k个结点

【题目描述】

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

【解题思路】

因为二叉搜索树其实结点的顺序已经排好了。左边的结点都比根节点小,右边的节点都比根节点大。现在需要寻找第k小的节点,即按照中序遍历方式遍历到的第k个结点。

使用非递归的方式中序遍历二叉树,因为遍历到第k个结点就需要停止遍历了。

【代码实现】

import javax.annotation.PostConstruct;
import java.util.Iterator;
import java.util.LinkedList;

/**
 * @Author: makexin
 * @Date: 2019/12/720:56
 */
public class Solution {
    TreeNode KthNode(TreeNode pRoot, int k)
    {
        LinkedList<TreeNode> orderList = new LinkedList<>();
        int p = 0;
        TreeNode node = pRoot;
        while (node!=null || !orderList.isEmpty())
        {
            while (node!=null)//左节点入栈
            {
                orderList.push(node);
                node = node.left;
            }
            if (!orderList.isEmpty())
            {
                node = orderList.pop();
                p++;
                if (p == k)
                    break;
                node = node.right;
            }
        }
        if (p == k)
            return node;
        else
            return null;
    }

    public static void main(String[] args)
    {
        TreeNode tree = new TreeNode(2);
        tree.left = new TreeNode(1);
        Solution s = new Solution();
        s.KthNode(tree, 3);
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值