[劍指Offer]-二叉搜索樹的第K大節點

題目描述

給定一顆二叉搜索樹,請找出其中的第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 上面!

發佈了171 篇原創文章 · 獲贊 187 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章