JZ54 二叉搜索树的第k个结点

描述

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

数据范围: 0 \le n <= 1000≤n<=100,0\le k \le 1000≤k≤100,树上每个结点的值满足 0 \le val \le 100 0≤val≤100
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

注意:不是返回结点的值

如输入{5,3,7,2,4,6,8},3时,二叉树{5,3,7,2,4,6,8}如下图所示:
该二叉树所有节点按结点值升序排列后可得[2,3,4,5,6,7,8],所以第3个结点的结点值为4,故返回对应结点值为4的结点即可。
输入描述:
提示:当n为0或者k为0时返回空。

示例1
输入:
{5,3,7,2,4,6,8},3
返回值:
4
说明:
按结点数值升序顺序可知第三小结点的值为4 ,故返回对应结点值为4的结点即可。

示例2
输入:
{},1
返回值:
“null”
说明:
结点数n为0,所以返回对应编程语言的空结点即可。

结题思路:

1.对树进行中序遍历,即先访问左孩点,然后访问根节点,最后访问右孩子。用一个ArrayList保存各个节点,ArrayList.get(k-1)即为第k小的数。代码如下:

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.ArrayList;
public class Solution {
    ArrayList<TreeNode> cap = new ArrayList<>();
    TreeNode KthNode(TreeNode pRoot, int k) {
        if(k <= 0) return null;
        helper(pRoot);
        return k <= cap.size() ? cap.get(k-1) : null;
    }
    void helper(TreeNode node){
        if(node == null) return;
        helper(node.left);
        cap.add(node);
        helper(node.right);
    }
}

2.优化
其实只要遍历中序遍历的前k个节点即可,k+1后面的可以不进行遍历。因此,同样的遍历思路,增加一个计数器index记录已排序的数量。

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
*/
import java.util.ArrayList;
public class Solution {
    int index = 0;
    TreeNode KthNode(TreeNode pRoot, int k) {
        //2.优化后增加一个计数器index,省去list
        if(pRoot == null) return null;
        TreeNode node = KthNode(pRoot.left, k);
        if(node != null) return node;
        index ++;
        if(index == k) return pRoot;
        return KthNode(pRoot.right, k);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值