题解 | #二叉搜索树的第k个结点#

二叉搜索树的第k个结点

http://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a

二叉搜索树的第k个结点

题目

给定一棵结点数为 n 二叉搜索树,请找出其中的第 k 小的TreeNode结点。 数据范围: 0≤n<=100,0≤k≤100,树上每个结点的值满足0≤val≤100 要求:空间复杂度 O(1),时间复杂度 O(n)

思路

二叉搜索树,是指一棵空树或者具有下列性质的二叉树:

1、若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

2、若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

3、任意节点的左,右子树也分别为二叉搜索树;

4、没有键值相等的节点。

使用中序遍历,将每个结点存进一个list集合中,此时的集合中每个结点已经是按照val值从小到大的顺序依次排序了。只要k符合范围,那么取出k-1的结点就是返回的结果。

本题的思路是参照他人的题解。

代码

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

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

    }

}
*/
import java.util.*;
public class Solution {
    ArrayList<TreeNode> res=new ArrayList();
    TreeNode KthNode(TreeNode pRoot, int k) {
        if(pRoot==null){
            return null;
        }
        
        preOrder(pRoot);
        TreeNode result=null;
        //如果k合法
        if(k-1>=0 && k-1<res.size()){
           result=res.get(k-1);
        }
        return result;
    }
    
    //中序遍历二叉搜索树
    void preOrder(TreeNode pRoot){
        if (pRoot != null){
            preOrder(pRoot.left);
            res.add(pRoot);
            preOrder(pRoot.right);
        }
    }
//     Deque<TreeNode> preOrder(TreeNode pRoot){
//         Deque<TreeNode> d = new ArrayDeque<>();
//         if (pRoot != null){
//             d.addLast(pRoot);
//             preOrder(pRoot.left);
//             preOrder(pRoot.right);
//         }
//         return d;
//     }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-08 10:39
一个证都没&nbsp;我能填什么
程序员小白条:别人有,你为什么没有,还是这个道理,社会就是比较,竞争,淘汰,你要安逸,那么就要做好淘汰的准备
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
Beeee0927:是缅甸园区吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务