首页 > 编程语言 >每日算法之二叉搜索树的第k个节点

每日算法之二叉搜索树的第k个节点

时间:2022-12-23 10:11:13浏览次数:40  
标签:TreeNode int res proot 之二 算法 return 节点

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

题目

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

  1. 返回第k小的节点值即可
  2. 不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1
  3. 保证n个节点的值不一样

思路

算法实现

根据二叉搜索树的性质,左子树的元素都小于根节点,右子树的元素都大于根节点。因此它的中序遍历(左中右)序列正好是由小到大的次序,
因此我们可以尝试递归中序遍历,也就是从最小的一个节点开始,找到k个就是我们要找的目标。

具体做法:
step 1:设置全局变量count记录遍历了多少个节点,res记录第k个节点。
step 2:另写一函数进行递归中序遍历,当节点为空或者超过k时,结束递归,返回。
step 3:优先访问左子树,再访问根节点,访问时统计数字,等于k则找到。
step 4:最后访问右子树。

代码

package mid.JZ54二叉搜索树的第k个节点;

import java.util.*;

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param proot TreeNode类
     * @param k     int整型
     * @return int整型
     */
    public int KthNode(TreeNode proot, int k) {
        midOrder(proot, k);
        if (res != null) {
            return res.val;
        } else {
            return -1;
        }
    }
public int KthNode2(TreeNode proot, int k) {
        // write code here
        if(proot == null || k == 0) return -1;
        List<Integer> res = new ArrayList<>();
        def(proot, res);
        System.out.println(res.size());
        System.out.println(k);
        System.out.println(res.size()< k);
        if(res.size()< k) return -1;
        Collections.sort(res);
        return res.get(k-1);
}

    public void def(TreeNode proot, List<Integer> res) {
        if (proot == null) return;
        def(proot.left, res);
        res.add(proot.val);
        def(proot.right, res);
    }
    //记录返回的节点
    private TreeNode res = null;
    //记录中序遍历了多少个
    private int count = 0;
    public void midOrder(TreeNode root, int k) {
        if (root == null || count > k) return;

        midOrder(root.left, k);
        count++;
        if (count == k) {
            res = root;
        }
        midOrder(root.right, k);
    }
}

标签:TreeNode,int,res,proot,之二,算法,return,节点
From: https://www.cnblogs.com/loongnuts/p/17000104.html

相关文章

  • wpf treeview 选中节点加载数据并绑定
    <TreeViewGrid.Row="0"Grid.Column="0"x:Name="FolderView"Canvas.Top="1"Canvas.Bottom="1"VerticalAlignment="Stretch"MouseLeftButtonUp="Fol......
  • wpf TreeView右键选中节点弹菜单
    <TreeViewx:Name="CustomTreeView"Canvas.Top="1"Canvas.Bottom="1"VerticalAlignment="Stretch"Margin="10,45,10,10"......
  • 【TEA算法】基于FPGA的TEA算法的实现
    1.软件版本MATLAB2013b,quartusii12.12.本算法理论知识标准的TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,至少32轮的加密循环次数。该算法使用......
  • JavaScript - DOM 利用节点获取元素
    节点操作网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点使用node来表示。HTMLDOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均......
  • 【Unity】基于波函数坍塌算法实现赛道自动化生成
    前言:很久没有写博客了,最近忙里偷闲准备恢复写博客的习惯,一是整理之前的笔记,二是梳理下知识点以供回顾。想写的内容很多,准备先针对以往做过的项目写个总结,最近在网上看到利......
  • 八大排序算法
    1.冒泡排序特点:相邻元素两两比较,把值大的元素往下交换。缺点:冒泡排序的时间复杂度太高冒泡排序的过程如下图所示,其展示了一趟排序的过程,在下一趟的排序过程中,最后一个排......
  • 机器学习--BP算法
    机器学习一、选题背景原因:本项目使用BP算法,对iris数据集(手写数字集)进行二分类,BP算法可以看做成一个浅层的神经网络,希望以后对学习深度学习有一个初步的探索。数据来......
  • #yyds干货盘点# LeetCode程序员面试金典:特定深度节点链表
    题目:给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为D,则会创建出D个链表)。返回一个包含所有深度的链表的数组。 示例:输入:[1,2,3,4,5,......
  • [leetcode]第 6 天 搜索与回溯算法(简单)
    32-I.从上到下打印二叉树思路没有思路。。看题解要求二叉树从上至下打印,叫做二叉树的广度优先搜索(BFS)。BFS通常借助队列的先入先出特性实现。算法流程:1.特例处理......
  • 【图像增强】基于粒子群优化和模拟退火的图像增强算法研究Matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......