劍指offer-面試題63-二叉搜尋樹的第k個結點
阿新 • • 發佈:2019-02-07
二叉樹節點定義:
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; } }