【Lintcode】1317。完全なツリーノードをカウントする

タイトルアドレス:

https://www.lintcode.com/problem/count-complete-tree-nodes/description

完全な二分木が与えられた場合、ノードの数を見つけます。

完全二分木の左右のサブツリーは必ず完全二分木であるため、分割統治法が利用できると考えられる。まず、2つのポインタを使用して左端と右端に移動し、バイナリツリー全体の左端と右端の深さが等しいかどうかを確認します。等しい場合は、バイナリツリーがいっぱいでノードの数を使用できることを意味します。 1 < < d e p t h 1 (1 <<深さ)-1 で計算します。それ以外の場合は、2つのサブツリーのノード数を再帰的に解決してから要約できます。コードは次のとおりです。

public class Solution {
    /**
     * @param root: root of complete binary tree
     * @return: the number of nodes
     */
    public int countNodes(TreeNode root) {
        // write your code here
        if (root == null) {
            return 0;
        }
        
        TreeNode left = root, right = root;
        int lDepth = 0, rDepth = 0;
        while (left != null) {
            lDepth++;
            left = left.left;
        }
    
        while (right != null) {
            rDepth++;
            right = right.right;
        }
        
        if (lDepth == rDepth) {
            return (1 << lDepth) - 1;
        } else {
        	// 分治
            return countNodes(root.left) + countNodes(root.right) + 1;
        }
    }
}

class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int x) {
        val = x;
    }
}

スペースの複雑さ ログ O(\ log n) 、時間の複雑さ ログ 2 O(\ log ^ 2n) スペースの複雑さはわかりやすい h = O ( log n ) O(h)= O(\ log n) 、時間の複雑さは次のように考えることができます。同じ再帰の深さの場合、片側だけが再帰を継続し、もう一方の側は式を直接適用するため、最悪の場合、再帰の各層は深さを通過する必要があります、したがって、合計時間の複雑さは O ( i = 1 h i ) = O ( h 2 ) = O ( log 2 n ) O(\ sum_ {i = 1} ^ {h} i)= O(h ^ 2)= O(\ log ^ 2n)

公開された387元の記事 ウォンの賞賛0 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_46105170/article/details/105464291
おすすめ