您的位置:首页 > Web前端

剑指offer57--搜素二叉树的第k个结点

2016-09-04 13:48 363 查看


一、题目


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


二、思想

(1)因为使用的是中序遍历,所以首先要在左子树中寻找

(2)当在左子树中没有找到的时候,然后到右子树中寻找


三、程序

package 剑指offer;

class BinaryTreeNodeK{
int value;
BinaryTreeNodeK left;
BinaryTreeNodeK right;

BinaryTreeNodeK(){
}

BinaryTreeNodeK(int value){
this.value = value;
}

public String toString(){
return value+"  ";
}
}

public class Test63 {

public static BinaryTreeNodeK findKnode(BinaryTreeNodeK root, int k) {
if (root == null || k < 1) {
return null;
}

int[] tmp = {k};
return findKnode(root, tmp);
}

public static BinaryTreeNodeK findKnode(BinaryTreeNodeK head, int k[]){
BinaryTreeNodeK result = null;

// 中序遍历,先在左子树中寻找
if(head.left != null){
result = findKnode(head.left, k);
}

// 如果在左子树中没有找到
if(result == null){
// 说明当前的根结点是所要找的结点
if(k[0] == 1){
result = head;
}else{
// 当前的根结点不是要找的结点,但是已经找过了,所以计数器减一
k[0]--;
}
}

// 根结点以及根结点的左子树都没有找到,则找其右子树
if(result == null && head.right != null){
result = findKnode(head.right, k);
}
return result;
}

private static void assemble(BinaryTreeNodeK n1,
BinaryTreeNodeK n2,
BinaryTreeNodeK n3) {
n1.left = n2;
n1.right = n3;
}

public static void main(String args[]){
BinaryTreeNodeK n1 = new BinaryTreeNodeK(1);
BinaryTreeNodeK n2 = new BinaryTreeNodeK(2);
BinaryTreeNodeK n3 = new BinaryTreeNodeK(3);
BinaryTreeNodeK n4 = new BinaryTreeNodeK(4);
BinaryTreeNodeK n5 = new BinaryTreeNodeK(5);
BinaryTreeNodeK n6 = new BinaryTreeNodeK(6);
BinaryTreeNodeK n7 = new BinaryTreeNodeK(7);

assemble(n1, n2, n3);
assemble(n2, n4, n5);
assemble(n3, n6, n7);

for(int i = 0; i <= 8; i++){
System.out.print(findKnode(n1, i)+" ");
}
}
}


------output------

null 4   2   5   1   6   3   7   null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息