求完全二叉樹的節點數 時間複雜度小於O(N)

給定一棵完全二叉樹的根節點root,返回這棵樹的節點個數。如果完全二叉樹的節點數爲N,請實現時間複雜度低於O(N)的解法。給定樹的根結點root,請返回樹的大小。

二分的思想。看完全二叉樹的最後的最右一個節點的位置

思路:
1 找到完全二叉樹的最左節點,也就是求左子樹的深度
2 找到完全二叉樹頭節點右子樹中的最左節點,記錄右子樹深度
3 如果兩個深度相等,說明頭節點左子樹是一棵滿二叉樹,使用公式求得長度再加上頭節點,然後對於右子樹使用遞歸求解
4 如果左子樹深度大於右子樹深度,說明右子樹是一棵完全二叉樹,使用公式求得長度再加上頭節點,然後對於左子樹使用遞歸求解.

public int count(TreeNode root) {
        if(root==null) return 0;
        int count = 0;
        TreeNode cur = root.left;
        //記錄左子樹的深度
        int ldepth = 0;
        while(cur!=null) {
            ldepth++;
            cur = cur.left;
        }
        cur = root.right;
        //記錄右子樹深度
        int rdepth = 0;
        while(cur!=null) {
            rdepth++;
            cur = cur.right;
        }

        //如果ldepth==rdepth,則說明左子樹是滿二叉樹,可用公式求解
        if(ldepth==rdepth) {
            //這裏不用減一,因爲把根節點算進去了
            count = (int)Math.pow(2, ldepth)+count(root.right);
        } else { //此時ldepth>rdepth,則說明右子樹是一棵滿二叉樹
            count = (int)Math.pow(2, rdepth) + count(root.left);
        }
        return count;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章