题目:给定一棵二叉搜索树,请找出当中的第k大的结点。


解题思路

  假设依照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。

仅仅须要用中序遍历算法遍历一棵二叉搜索树。就非常easy找出它的第k大结点。

结点定义

private static class BinaryTreeNode {
private int val;
private BinaryTreeNode left;
private BinaryTreeNode right; public BinaryTreeNode() {
} public BinaryTreeNode(int val) {
this.val = val;
} @Override
public String toString() {
return val + "";
}
}

代码实现

public class Test63 {
private static class BinaryTreeNode {
private int val;
private BinaryTreeNode left;
private BinaryTreeNode right; public BinaryTreeNode() {
} public BinaryTreeNode(int val) {
this.val = val;
} @Override
public String toString() {
return val + "";
}
} public static BinaryTreeNode kthNode(BinaryTreeNode root, int k) {
if (root == null || k < 1) {
return null;
} int[] tmp = {k};
return kthNodeCore(root, tmp);
} private static BinaryTreeNode kthNodeCore(BinaryTreeNode root, int[] k) {
BinaryTreeNode result = null; // 先成左子树中找
if (root.left != null) {
result = kthNodeCore(root.left, k);
} // 假设在左子树中没有找到
if (result == null) {
// 说明当前的根结点是所要找的结点
if(k[0] == 1) {
result = root;
} else {
// 当前的根结点不是要找的结点。可是已经找过了。所以计数器减一
k[0]--;
}
} // 根结点以及根结点的左子树都没有找到,则找其右子树
if (result == null && root.right != null) {
result = kthNodeCore(root.right, k);
} return result;
} public static void main(String[] args) {
BinaryTreeNode n1 = new BinaryTreeNode(1);
BinaryTreeNode n2 = new BinaryTreeNode(2);
BinaryTreeNode n3 = new BinaryTreeNode(3);
BinaryTreeNode n4 = new BinaryTreeNode(4);
BinaryTreeNode n5 = new BinaryTreeNode(5);
BinaryTreeNode n6 = new BinaryTreeNode(6);
BinaryTreeNode n7 = new BinaryTreeNode(7);
BinaryTreeNode n8 = new BinaryTreeNode(8);
BinaryTreeNode n9 = new BinaryTreeNode(9); n1.left = n2;
n1.right = n3;
n2.left = n4;
n2.right = n5;
n3.left = n6;
n3.right = n7;
n4.left = n8;
n4.right = n9; print(n1);
System.out.println(); for (int i = 0; i <= 10; i++) {
System.out.printf(kthNode(n1, i) + ", ");
} } /**
* 中序遍历一棵树
* @param root
*/
private static void print(BinaryTreeNode root) {
if (root != null) {
print(root.left);
System.out.printf("%-3d", root.val);
print(root.right);
}
}
}

执行结果

特别说明

欢迎转载,转载请注明出处【http://blog.csdn.net/DERRANTCM/article/details/46872313

【剑指Offer学习】【面试题63:二叉搜索树的第k个结点】的更多相关文章

  1. 《剑指offer》面试题54. 二叉搜索树的第k大节点

    问题描述 给定一棵二叉搜索树,请找出其中第k大的节点.   示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \   2 输出: 4 示例 2: 输入: ...

  2. 《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版

    (判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道 ...

  3. 《剑指offer》面试题33. 二叉搜索树的后序遍历序列

    问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同.   参考以下这颗二叉搜索树: 5 / \ ...

  4. 《剑指offer》面试题36. 二叉搜索树与双向链表

    问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...

  5. 《剑指offer》面试题27 二叉搜索树与双向链表 Java版

    (将BST改成排序的双向链表.) 我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列.如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单.关 ...

  6. (剑指Offer)面试题15:链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...

  7. C++版 - 剑指offer 面试题63:二叉搜索树的第k个结点(二叉树中序遍历的应用) 题解

    面试题 63:二叉搜索树的第k个结点 题目:给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 (见下面的图1) 中,按结点数值大小顺序第三个结点的值 ...

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

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

  9. 《剑指offer》第五十四题(二叉搜索树的第k个结点)

    // 面试题54:二叉搜索树的第k个结点 // 题目:给定一棵二叉搜索树,请找出其中的第k大的结点. #include <iostream> #include "BinaryTr ...

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

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

随机推荐

  1. Test Doubles - Fakes, Mocks and Stubs.

    https://dev.to/milipski/test-doubles---fakes-mocks-and-stubs This text was originally posted at Prag ...

  2. 架构-Eureka:第一个方法

    ylbtech-架构-Eureka:第一个方法 工程介绍 Spring Cloud 工程目录 model registry-center Servers tzxyfx tzxyfx-provider ...

  3. php打马赛克

    本文实例讲述了php实现图片局部打马赛克的方法.分享给大家供大家参考.具体分析如下: 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. ...

  4. Meson使用

    安装 Meson是基于python3实现,至少需要python3.5才能运行,默认采用ninja作为后端.在Ubuntu下最简单的是通过pip3安装 $ sudo apt-get install py ...

  5. C - Young Physicist

    Problem description A guy named Vasya attends the final grade of a high school. One day Vasya decide ...

  6. html5和css3的笔记

    h5+c3 W3C盒子模型和ie盒子模型 文档<!DOCTYPE html>加上的话,所有浏览器都按照W3C的盒子模型,否则ie会按照ie的盒子模型,它的content包括了padding ...

  7. (转)es6用法

    如何在浏览器中使用es6的语法呢? 方法一:引入文件相关js文件 <script src="traceur.js"></script> <script ...

  8. hadoop基础学习

    MR系类: ①hadoop生态 >MapReduce:分布式处理 >Hdfs:hadoop distribut file system >其他相关框架 ->unstructur ...

  9. Android对手尽皆铩羽,鸿蒙如何绝地求生?

    Android对手尽皆铩羽,鸿蒙如何绝地求生? 作为华为绝地反击备胎计划中的重要组成部分,鸿蒙被国人寄予了厚望.但是,除了热情我们更应该理性关注,鸿蒙对决Android未来有几成胜算?还有哪些问题需要 ...

  10. U盘启动盘安装Mac OS

    1.下载macOS High Sierra正式版 http://www.pc6.com/mac/gj_715_1.htm http://www.pc6.com/mac/518996.html 下载ma ...