題目描述
給定一顆二叉搜索樹,請找出其中的第k大的結點。
解題思路
- 中序遍歷二叉樹
- 遞歸將遍歷的節點按順序存入集合
- 獲取第K-1個集合元素
遞歸真的反人性全靠想象。
算法圖解
參考代碼:
package offer;
import java.util.ArrayList;
/**
* 二叉搜索樹的第K大節點
*/
public class Offer54 {
public static void main(String[] args) {
TreeLinkNode root = new TreeLinkNode(5);
TreeLinkNode node2 = new TreeLinkNode(3);
TreeLinkNode node3 = new TreeLinkNode(7);
TreeLinkNode node4 = new TreeLinkNode(2);
TreeLinkNode node5 = new TreeLinkNode(4);
TreeLinkNode node6 = new TreeLinkNode(6);
TreeLinkNode node7 = new TreeLinkNode(8);
root.left = node2;
root.right = node3;
node2.left = node4;
node2.right = node5;
node3.left = node7;
node3.right = node6;
TreeLinkNode kMax = findKMax(root, 3);
System.out.println(kMax.val);
}
static TreeLinkNode findKMax(TreeLinkNode pRoot, int k) {
//中序遍歷的第k-1個節點就是第k大的節點
if (pRoot == null || k <= 0)
return null;
ArrayList<TreeLinkNode> aList = new ArrayList();
inOrderRecursive(pRoot, aList);
int len = aList.size();
if (len < k)
return null;
else
return aList.get(k - 1);
}
static void inOrderRecursive(TreeLinkNode root, ArrayList<TreeLinkNode> al) {
if (root == null) {
return;
}
inOrderRecursive(root.left, al);
al.add(root);
//System.out.println(root.val);
inOrderRecursive(root.right, al);
}
}
附錄
該題源碼在我的 ?Github 上面!