1. 程式人生 > >[leetcode]222. Count Complete Tree Nodes完全二叉樹的節點數

[leetcode]222. Count Complete Tree Nodes完全二叉樹的節點數

col 相對 complete int lee log 滿二叉樹 繼續 root

/*
    滿二叉樹的特點是2^n-1,對於完全二叉樹,一個node如果左右子樹深度相同,那麽
    是一個滿二叉樹。如果不是,那就把node算上,繼續往下看,下邊的可能是滿二叉樹
    由於完全二叉樹中有一些子滿二叉樹,所以可以省時間
     */
    public int countNodes(TreeNode root) {
        if (root==null) return 0;
        int l = getLeft(root);
        int r = getRight(root);
        return (l == r)?(1<<l)-1:countNodes(root.left)+countNodes(root.right)+1;
    }
    
//獲取左子樹深度 private int getLeft(TreeNode root) { if (root==null) return 0; return getLeft(root.left)+1; } //獲取右子樹深度 private int getRight(TreeNode root) { if (root==null) return 0; return getRight(root.right)+1; }

這個題直接遍歷會超時。利用了滿二叉樹的特點,完全二叉樹中滿二叉樹還是有不少的。

對於滿二叉樹的定義,國內的定義除了每個節點都左右子樹外,要求所有葉子節點都在一層上,但是國際上的只要前一個條件就可以。這裏說的滿二叉樹是國內定義的那種。

完全二叉樹相對於滿二叉樹,最後一層可能缺失最右邊幾個節點。

以後遇見完全二叉樹,可以多考慮下滿二叉樹的特點。

[leetcode]222. Count Complete Tree Nodes完全二叉樹的節點數