IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> JZ54 二叉搜索树的第k个结点 -> 正文阅读

[数据结构与算法]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);
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:44:30  更:2021-10-20 12:46:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:17:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码