您的位置:首页 > 职场人生

剑指offer面试题63:二叉搜索树的第k个节点 Java实现

2016-10-17 22:31 525 查看
题目:二叉搜索树的第k个节点

         给定一颗二叉搜索树,请找出其中的第k大的节点。例如,下图中的二叉搜索树中,按节点数值大小顺序第三个节点的值 是4.


 


算法分析:

如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。上图中的二叉搜索树的中序遍历序列为{2,3,4,5,6,7,8},因此,只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第k大结点。

算法源程序:

/**************************************************************
* Copyright (c) 2016,
* All rights reserved.
* 版 本 号:v1.0
* 题目描述:二叉搜索树的第k个节点
*		         给定一颗二叉搜索树,请找出其中的第k大的节点。例如,下图中的二叉搜索树中,按节点数值大小顺序第三个节点的值 是4.
* 输入描述:无
* 程序输出:第3大的节点是:
*			4
* 问题分析: 无
* 算法描述:如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。
* 			上图中的二叉搜索树的中序遍历序列为{2,3,4,5,6,7,8},因此,只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第k大结点。

* 完成日期:2016-10-17
***************************************************************/

package org.marsguo.offerproject63;

class TreeNode{
int val;
public TreeNode left = null;
public TreeNode right = null;
public TreeNode(int val){
this.val = val;
}
public String toString(){
return val + "";
}
}

class SolutionMethod1{
public TreeNode inorderTraversal(TreeNode root,int k){
if(root == null || k == 0){
return null;
}
int[] temp = {k};
return inorderTraversalCore(root,temp);
}

public TreeNode inorderTraversalCore(TreeNode root,int[] k){
TreeNode target = null;

if(root.left != null )
target = inorderTraversalCore(root.left,k);

if(target == null){
if(k[0] == 1)
target = root;
k[0]--;
}
if(target == null && root.right != null)
target = inorderTraversalCore(root.right, k);

return target;
}
}

public class KthNode {
public static void main(String[] args){
SolutionMethod1 solution1 = new SolutionMethod1();

TreeNode n1 = new TreeNode(5);
TreeNode n2 = new TreeNode(3);
TreeNode n3 = new TreeNode(7);
TreeNode n4 = new TreeNode(2);
TreeNode n5 = new TreeNode(4);
TreeNode n6 = new TreeNode(6);
TreeNode n7 = new TreeNode(8);
//		TreeNode n8 = new TreeNode(8);
//		TreeNode n9 = new TreeNode(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;
System.out.println("第" + 3 + "大的节点是:");
System.out.println(solution1.inorderTraversal(n1, 3));
}
}


程序运行结果:




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