劍指offer面試題63:二叉搜索樹的第k個節點 Java實現

題目:二叉搜索樹的第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));
	}
}

程序運行結果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章