1. 程式人生 > >劍指offer-面試題63-二叉搜尋樹的第k個結點

劍指offer-面試題63-二叉搜尋樹的第k個結點

二叉樹節點定義:

package case63_KthNodeOfBST;

/**
 * 二叉搜尋樹的結點結構定義
 * 
 * @author WangSai
 *
 */
public class MyNode {
	int data;
	MyNode lchild;
	MyNode rchild;

	public MyNode() {
	}

	public MyNode(int data) {
		this.data = data;
	}

}


程式碼實現:

package case63_KthNodeOfBST;

/**
 * 題目:給定一棵二叉搜尋樹,請找出其中的第K大的結點。例如在下圖的二叉搜尋樹中,按節點數值大小順序第三個結點的值是4
 * ............5...............................................................
 * ........../....\............................................................
 * .........3......7...........................................................
 * ......./..\.../...\..........................................................
 * ......2...4...6....8.........................................................
 * 
 * 
 * @author WangSai
 *
 */

public class KthNodeOfBST {

	public static void main(String[] args) {
		KthNodeOfBST kno = new KthNodeOfBST();
		MyNode root = new MyNode(5);
		MyNode N2 = new MyNode(3);
		MyNode N3 = new MyNode(7);
		MyNode N4 = new MyNode(2);
		MyNode N5 = new MyNode(4);
		MyNode N6 = new MyNode(6);
		MyNode N7 = new MyNode(8);
		root.lchild = N2;
		root.rchild = N3;
		N2.lchild = N4;
		N2.rchild = N5;
		N3.lchild = N6;
		N3.rchild = N7;
		System.out.println(kno.findKthOfBST(root, 6).data);

	}

	/**
	 * 二叉搜尋樹的左子節<父節點<右子節點,根據中序遍歷,即可進行排序並獲取第K個節點。
	 * 
	 * @param root,二叉搜尋樹的根節點
	 * @param k,k值
	 * @return 第k個二叉樹節點
	 */
	private MyNode findKthOfBST(MyNode root, int k) {
		// 異常值檢測
		if (root == null || k <= 0)
			throw new IllegalArgumentException("非法輸入引數,請重新檢查...");
		int[] temp = { k };
		// 採用中序遍歷的方法,便可以得到第K大的值
		return findKthOfBSTCore(root, temp);
	}

	// 通過中序遍歷二叉樹
	private MyNode findKthOfBSTCore(MyNode root, int[] temp) {
		MyNode tempNode = null;
		if (root == null)
			return null;
		// 先在左子樹中遍歷
		tempNode = findKthOfBSTCore(root.lchild, temp);
		// 左子樹中沒有找到
		if (tempNode == null) {
			// 當前的根結點是所要找的結點
			if (temp[0] == 1)
				return root;
			// 當前的根結點不是要找的結點,但是已經找過了,所以計數器減一
			else
				temp[0]--;
		}
		// 左子樹中沒有找到,並且當前節點不是所要找的點,尋找右子節點
		if (tempNode == null)
			tempNode = findKthOfBSTCore(root.rchild, temp);
		return tempNode;
	}

}