剑指Offer--Java--二叉搜索树的第k个结点

题目描述

给定一棵二叉搜索树,请找出其中的第k小的结点。

你可以假设树和k都存在,并且1≤k≤树的总结点数。

样例描述

输入:root = [2, 1, 3, null, null, null, null] ,k = 3

    2
   / \
  1   3

输出:3

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

思路

  1. 理清逻辑,第k小的结点实际上是结点单调增排序后的第k个。
  2. BST(二叉搜索树)的特点是中序遍历序列是单调增序列。因此直接递归进行中序遍历,设置计数器c,当增加到k时结点就是答案。
  3. dfs递归中要注意root!=null这个范围限制,不然会报空指针错误。

代码

class Solution {
      TreeNode ans;
      //计数器,加到k时就是所要求的
      int c=0;
    public TreeNode kthNode(TreeNode root, int k) {
        dfs(root,k);
        return ans;
    }  //直接中序遍历即可,因为BST的中序遍历是单调增序列
    void dfs(TreeNode root,int k){
         if(root!=null){
             dfs(root.left,k);
             c++;
             if(c==k) ans=new TreeNode(root.val);
             dfs(root.right,k);
         }
         return;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值