1. 程式人生 > >LeetCode222. 完全二叉樹的節點個數

LeetCode222. 完全二叉樹的節點個數

給出一個完全二叉樹,求出該樹的節點個數。

說明:

完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1~ 2h 個節點。

示例:

輸入: 
    1
   / \
  2   3
 / \  /
4  5 6

輸出: 6

思路:首先想到遍歷二叉樹,計數所有二叉樹結點,但該演算法會超出時間限制。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
         int count=0;
        if(null==root){
            return count;
        }
        ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>();
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode node=queue.removeFirst();
            count++;
            if(null!=node.left){
                queue.add(node.left);
            }
            if(null!=node.right){
                queue.add(node.right);
            }
        }
        return count;
    }
}

解法二:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

     /**
     * 判斷一棵樹是否是滿二叉樹
     * 二叉樹的最左邊的葉子結點的深度如果等於最右邊的葉子結點的深度,是滿二叉樹
     * 是的話返回滿二叉樹的結點數
     * 否的話再判斷該結點的左子樹以及右子樹是否是滿二叉樹
     * @param root
     * @return
     */
    public int countNodes(TreeNode root) {
         if(null==root){
            return 0;
        }
        int leftDepth=1;//最左邊的葉子結點深度
        int rightDepth=1;//最右邊的葉子結點的深度
        TreeNode tmp=root;
        while (null!=tmp.left){
            leftDepth++;
            tmp=tmp.left;
        }
        tmp=root;
        while (null!=tmp.right){
            rightDepth++;
            tmp=tmp.right;
        }
        if(leftDepth==rightDepth){  //是滿二叉樹
            //滿二叉樹結點數  n=2^h-1  [n]結點數 [h]滿二叉樹深度
            return (int) (Math.pow(2,leftDepth)-1);
        }
        return countNodes(root.left)+countNodes(root.right)+1;
    }
}