如果按照中序遍歷的順序遍歷一棵二叉搜索樹,遍歷序列的數(shù)值是遞增排序的。只需要用中序遍歷算法遍歷一棵二叉搜索樹,就很容易找出它的第k大結(jié)點(diǎn)。
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) {
// 說明當(dāng)前的根結(jié)點(diǎn)是所要找的結(jié)點(diǎn)
if(k[0] == 1) {
result = root;
} else {
// 當(dāng)前的根結(jié)點(diǎn)不是要找的結(jié)點(diǎn),但是已經(jīng)找過了,所以計(jì)數(shù)器減一
k[0]--;
}
}
// 根結(jié)點(diǎn)以及根結(jié)點(diǎn)的右子結(jié)點(diǎn)都沒有找到,則找其右子樹
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://wiki.jikexueyuan.com/project/for-offer/images/81.png" alt="" />