面试题:二叉搜索树的第k大节点
题目:
给定一颗二叉搜索树,请找出其中第k大的节点。
例如:在图6.1中的二叉树搜索树里,按节点数值大小顺序,第三大的节点值是4
方法:
二叉搜索树已经是排序好的,所以直接中序顺序遍历,即可以得到排好序的数组,遍历到第k个结点返回即可
代码:
public class Q54 {
public static void main(String[] args) {
BinaryTreeNode head = getTree();
int k = 7;
maxK(head,k);
}
public static void maxK(BinaryTreeNode head, int k) {
int[] loc = new int[] {0};
BinaryTreeNode re = fromHead(head, loc, k);
if(re!=null) {
System.out.printf("%dth :%d\n",k,re.val);
}else {
System.out.println("no such k!");
}
}
public static BinaryTreeNode fromHead(BinaryTreeNode head,int[] loc,int k) {
if(head!=null) {
// 左子树
BinaryTreeNode temp = fromHead(head.left, loc, k);
if(temp!=null) {
return temp;
}
// 中间节点
loc[0]++;
System.out.printf("%d %d \n", head.val,loc[0]);
if(loc[0]==k) {
return head;
}
// 右子树
temp = fromHead(head.right, loc, k);
if(temp!=null) {
return temp;
}
}
return null;
}
public static BinaryTreeNode getTree() {
BinaryTreeNode node5 = new BinaryTreeNode(5);
BinaryTreeNode node3 = new BinaryTreeNode(3);
BinaryTreeNode node7 = new BinaryTreeNode(7);
BinaryTreeNode node2 = new BinaryTreeNode(2);
BinaryTreeNode node4 = new BinaryTreeNode(4);
BinaryTreeNode node6 = new BinaryTreeNode(6);
BinaryTreeNode node8 = new BinaryTreeNode(8);
node5.left = node3;
node5.right = node7;
node3.left = node2;
node3.right = node4;
node7.left = node6;
node7.right = node8;
return node5;
}
}