概述
目录
- 题目
- 1.分析
- 2.算法实现
题目
题目:给定一棵二叉搜索树,请找出其中第K大的节点。例如,在图1中的二叉搜索树里,按节点数值大小顺序,第三大节点的值是4。
图1
1.分析
这个题目的描述让人一脸懵,二叉搜索树的第K大节点听上去格调杠杠的,类似于“甚高频”听上去也是怕怕的,一看英语very high frequency是不是瞬间感觉好多了。
如果中序遍历一棵二叉搜索树,得到的遍历序列的数值是递增排序的。例如,图一中二叉搜索树的中序遍历序列是{2,3,4,5,6,7,8}。因此,只需要用中序遍历算法遍历一棵二叉搜索树,我们就很容易得到它的第K大节点。
注意:对二叉树不是很了解的,可以看看我的文章中阅读量最高的二叉树(从建树、遍历到存储)Java.
2.算法实现
这是我在学习过程中模仿Java集合类写的一个二叉树类,所以把节点类(Node)以内部类的形式写在二叉树类(BinaryTree)的里面。以Integer类为例,如果引入泛型的话,所有类都可以,欢迎大家指导。
BinaryTree类:
import java.util.LinkedList;
public class BinaryTree {
//节点个数
private int size;
//根节点
private Node root;
public BinaryTree() {
}
//有参构造方法
public BinaryTree(Integer[] c) {
this();
root = addAllRecur(c);
}
//前序遍历数据创建二叉树(递归)
private Node addAllRecur(Integer[] c) {
Integer var = c[size++];
if (var == null) {
return null;
}
Node node = new Node(var);
node.left = addAllRecur(c);
node.right = addAllRecur(c);
return node;
}
//第K大节点
public Integer KthNode(int k) {
if (root == null || k == 0)
return -1;
Node current = root;
LinkedList<Node> s = new LinkedList<Node>();
while (current != null || !s.isEmpty()) {
while (current != null) {
s.addFirst(current);
current = current.left;
}
if (!s.isEmpty()) {
current = s.removeFirst();
k--;
if (k == 0)
return current.data;
current = current.right;
}
}
return -1;
}
private static class Node {
Integer data;
Node right;
Node left;
Node(Integer data) {
this.data = data;
}
}
}
测试类:
public class Demo {
public static void main(String[] args) {
//前序遍历建树
Integer[] arr = { 5, 3, 2, null, null, 4, null, null, 7, 6, null, null, 8, null, null };
BinaryTree tree = new BinaryTree(arr);
System.out.println("第K大节点:");
System.out.println(tree.KthNode(3));
}
}
建立的树:
测试结果:
第K大节点:
4
注意:如果真的不喜欢在BinaryTree类中用Integer类的话,可以将其改成int,只不过这样一来,测试类中用于建树的数组也要修改,其中的null可以修改成一些特殊的标记,如0。
最后
以上就是和谐香水为你收集整理的剑指offer第二版54题:二叉搜索树的第K大节点Java题目的全部内容,希望文章能够帮你解决剑指offer第二版54题:二叉搜索树的第K大节点Java题目所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复