剑指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
相关文章推荐
- 剑指offer | 训练题61:二叉树搜索的第K个结点
- 剑指offer-57.二叉树的下一个结点
- 剑指offer_二叉树---二叉搜索树的第k个结点
- 剑指Offer_57_二叉树的下一个结点
- 剑指offer 链表中倒数第k个结点
- 【剑指Offer】面试题15:链表中倒数第K个结点
- 剑指offer面试题[57]-删除链表中重复的结点
- 剑指offer:链表中倒数第k个结点(java)
- 剑指offer第十四题【链表中倒数第k个结点】c++实现
- 剑指offer(六十二)之二叉搜索树的第k个结点
- 剑指offer--面试题15:链表中倒数第K个结点--Java实现
- 剑指Offer--063-二叉搜索树的第K个结点
- 剑指offer-面试题15-链表中倒数第k个结点
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
- 剑指Offer-链表中倒数第k个结点
- 剑指Offer--015-链表中倒数第k个结点
- 剑指offer57 删除链表中重复的结点
- 剑指Offer 15 输入一个链表,输出该链表中倒数第k个结点
- 剑指offer-算法题练习:part16 链表中倒数第k个结点
- 剑指offer(C++)——二叉搜索树的第k个结点