题目:给定一棵二叉搜索树,请找出当中的第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

最新文章

  1. Linux下的C Socket编程 -- server端的简单示例
  2. (转)对博士学位说永别 by 王珢
  3. sql之left join、right join、inner join的区别
  4. java分享第八天-01(线程)
  5. jquery 源码解析 节点遍历
  6. 鼠标点击输入框文字消失 value placeholder 以及JQ实现效果 (仿京东的输入框效果)
  7. 第八十七天请假 PHP smarty模板配置以及简单的调用方式
  8. JAVA_输入输出流 异常处理
  9. Firefox插件一键切换兼容IE
  10. POJ 1852
  11. 作为平台的Windows PowerShell(一)
  12. nginx的autoindex-目录浏览还有其它两个参数
  13. Windows API 之 CreateThread、GetExitCodeThread(未完)
  14. jQuery中的选择器(下)
  15. linux使用crontab实现PHP执行定时任务
  16. html的基本标记符号
  17. Zabbix实战-简易教程--监控OSPF
  18. 3d轮播图(另一种方式,可以实现的功能更为强大也更为灵活,简单一句话,比酷狗优酷的炫)
  19. asp.net core 系列 14 错误处理
  20. CSS基础选择器(选择器的优先级),CSS样式块( 长度/颜色/显示方式/文本样式),盒模型组成,盒模型-block,盒模型布局

热门文章

  1. luogu3386 【模板】 二分图匹配
  2. PHP 和 Java 的主要区别有哪些?
  3. C Tricks(十七)—— 对角线元素的屏蔽、二维数组(矩阵)的遍历
  4. php递归取目录下的所有文件(原创)
  5. java中 抽象类和抽象方法
  6. linux系统下块设备驱动程序
  7. JDBC基础01
  8. 【Oracle】使用logmnr挖掘日志
  9. Win10 UWP Tile Generator
  10. undefined reference to “boost” in Qt—Ubuntu