题目描述

给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

题解一:DFS 借助栈实现
  1. // 中序非递归
  2. public static TreeNode KthNode02(TreeNode pRoot, int k) {
  3. Stack<TreeNode> stack = new Stack<>();
  4. if(pRoot==null||k<=0){
  5. return null;
  6. }
  7. int count=0;
  8. while(pRoot!=null||!stack.isEmpty()){
  9. while(pRoot!=null){
  10. stack.push(pRoot);
  11. pRoot=pRoot.left;
  12. }
  13. pRoot = stack.pop();
  14. count++;
  15. if(count==k){
  16. return pRoot;
  17. }
  18. pRoot=pRoot.right;
  19. }
  20. return null;
  21. }
题解二:中序遍历
  1. //中序遍历二叉搜索树后正好是从小到大的顺序,直接返回第k-1个即可
  2. private static ArrayList<TreeNode> treeNode=new ArrayList<TreeNode>();
  3. public static TreeNode KthNode01(TreeNode pRoot, int k) {
  4. //中序遍历
  5. InOrder(pRoot);
  6. if(treeNode.size()<1||k<1||k>treeNode.size()) {
  7. return null;
  8. }
  9. return treeNode.get(k-1);
  10. }
  11. public static void InOrder(TreeNode node) {
  12. if(node!=null)
  13. {
  14. InOrder(node.left);
  15. treeNode.add(node);
  16. InOrder(node.right);
  17. }
  18. }
题解三:递归
  1. public static int index = 0;
  2. public static TreeNode KthNode(TreeNode pRoot, int k) {
  3. //中序遍历寻找第k个
  4. if(pRoot != null){
  5. TreeNode node = KthNode(pRoot.left,k);
  6. if(node != null) {
  7. return node;
  8. }
  9. index ++;
  10. if(index == k) {
  11. return pRoot;
  12. }
  13. node = KthNode(pRoot.right,k);
  14. if(node != null) {
  15. return node;
  16. }
  17. }
  18. return null;
  19. }

初始化树:

  1. public static class TreeNode{
  2. int val=0;
  3. TreeNode left=null;
  4. TreeNode right=null;
  5. public TreeNode(int val){
  6. this.val=val;
  7. }
  8. }
  9. private static List<TreeNode> nodeList = null;
  10. public static TreeNode createBinTree(int[] array) {
  11. nodeList=new LinkedList<TreeNode>();
  12. // 将一个数组的值依次转换为TreeNode节点
  13. for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
  14. nodeList.add(new TreeNode(array[nodeIndex]));
  15. }
  16. // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
  17. for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
  18. // 左孩子
  19. nodeList.get(parentIndex).left = nodeList
  20. .get(parentIndex * 2 + 1);
  21. // 右孩子
  22. nodeList.get(parentIndex).right = nodeList
  23. .get(parentIndex * 2 + 2);
  24. }
  25. // 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
  26. int lastParentIndex = array.length / 2 - 1;
  27. // 左孩子
  28. nodeList.get(lastParentIndex).left = nodeList
  29. .get(lastParentIndex * 2 + 1);
  30. // 右孩子,如果数组的长度为奇数才建立右孩子
  31. if (array.length % 2 == 1) {
  32. nodeList.get(lastParentIndex).right = nodeList
  33. .get(lastParentIndex * 2 + 2);
  34. }
  35. return nodeList.get(0);
  36. }

测试:

  1. public static void main(String[] args) {
  2. int[] arr= {8,6,10,5,7,9,11};
  3. int k=2;
  4. TreeNode root = createBinTree(arr);
  5. TreeNode node = KthNode02(root, k);
  6. System.out.println(node.val);
  7. }
  8. 输出:6

【剑指Offer】63、二叉搜索树的第k个结点的更多相关文章

  1. 【剑指Offer】二叉搜索树的第k个结点 解题报告(Python)

    [剑指Offer]二叉搜索树的第k个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  2. 剑指offer 62. 二叉搜索树的第 k 个结点

    62. 二叉搜索树的第 k 个结点 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 法一: 非递归中序 ...

  3. 剑指offer:二叉搜索树的第k个结点(中序遍历)

    1. 题目描述 /* 给定一棵二叉搜索树,请找出其中的第k小的结点. 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. */ 2. 思路 中序遍历二叉搜索树,第K个就 ...

  4. 【Java】 剑指offer(54) 二叉搜索树的第k个结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一棵二叉搜索树,请找出其中的第k小的结点. 思路 设置全局变量 ...

  5. 剑指Offer 62. 二叉搜索树的第k个结点 (二叉搜索树)

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 例如, 5 / \ 3 7 / \ / \ 2 4 6 ...

  6. [剑指Offer] 62.二叉搜索树的第k个结点

    题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. [思路]遍历二叉搜索树,存入一个vector ...

  7. 力扣 - 剑指 Offer 54. 二叉搜索树的第k大节点

    题目 剑指 Offer 54. 二叉搜索树的第k大节点 思路1 二叉搜索树的特性就是中序遍历结果为递增序列,而题目要求的是第 k 大节点,所以就应该是要遍历结果为降序, 按照先遍历左子树.输出节点.遍 ...

  8. Go语言实现:【剑指offer】二叉搜索树的第k个的结点

    该题目来源于牛客网<剑指offer>专题. 给定一棵二叉搜索树,请找出其中的第k小的结点.例如,(5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. Go语言实现: ...

  9. 剑指offer——59二叉搜索树的第k大节点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4.   题解: 考察的就是中序遍历 不过注意进行剪枝 cl ...

  10. 每日一题 - 剑指 Offer 54. 二叉搜索树的第k大节点

    题目信息 时间: 2019-07-04 题目链接:Leetcode tag:二叉搜索树 中序遍历 递归 难易程度:中等 题目描述: 给定一棵二叉搜索树,请找出其中第k大的节点. 示例1: 输入: ro ...

随机推荐

  1. javase第一章(了解java)

    ------------恢复内容开始------------ java介绍 java这门语言,如果你是一名IT从业者,那么就一定是会有所耳闻的,毕竟,这是编程史上其商业化最成功的一门语言,当然, 编程 ...

  2. C++标准模板库(STL)学习笔记

    C++标准模板库(STL) 一.vector(变长数组) 1.使用vector #include <vector> using namespace std; 2.vector的定义 vec ...

  3. css-position:absolute, relative 的用法

      static(静态) 没有特别的设定,遵循基本的定位规定,不能通过z-index进行层次分级.就无法通过top,left ,bottom,right 定位.(static 为默认值)  relat ...

  4. 关于SQL Server 2012 手动安装帮助文档

    大家以为安装帮助文档很简单,但是其实不然,这其中还有那么一点点道道.今天我就来给大家演示一下! 首先到microsoft官网上下载Microsoft SQL Server 2012 产品文档,然后将. ...

  5. Python原来这么好学-1.1节: 在windows中安装Python

    这是一本教同学们彻底学通Python的高质量学习教程,认真地学习每一章节的内容,每天只需学好一节,帮助你成为一名卓越的Python程序员: 本教程面向的是零编程基础的同学,非科班人士,以及有一定编程水 ...

  6. golang函数 和 条件语句

    /* if : if 语句 由一个布尔表达式后紧跟一个或多个语句组成 is else : if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行 s ...

  7. css常用元素通用样式表

    @charset "utf-8";html,body,a,h1,h2,h3,h4,h5,h6,p,a,b,i,em,s,u,dl,dt,dd,ul,ol,li,strong,spa ...

  8. pinpoint 修改hbase表TTL值

    操作步骤 查找出数据大的hbase表 root@990fb5560f64:/opt/hbase/hbase-# ls CHANGES.txt LICENSE.txt README.txt conf h ...

  9. CNN目标检测系列算法发展脉络——学习笔记(一):AlexNet

    在咨询了老师的建议后,最近开始着手深入的学习一下目标检测算法,结合这两天所查到的资料和个人的理解,准备大致将CNN目标检测的发展脉络理一理(暂时只讲CNN系列部分,YOLO和SSD,后面会抽空整理). ...

  10. toj 3019 Hidden Password (最小表示法)

    Hidden Password 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交: 53 测试通过: 19 描述 Some time the progr ...