1. 程式人生 > 實用技巧 >【LeetCode-樹】完全二叉樹的節點個數

【LeetCode-樹】完全二叉樹的節點個數

題目描述

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

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

輸出: 6

題目連結: https://leetcode-cn.com/problems/count-complete-tree-nodes/

思路1

使用 dfs。程式碼如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if(root==nullptr) return 0;

        return countNodes(root->left)+countNodes(root->right)+1;
    }
};

思路2

使用bfs。程式碼如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if(root==nullptr) return 0;

        queue<TreeNode*> q;
        q.push(root);
        int cnt = 0;
        while(!q.empty()){
            TreeNode* node = q.front(); q.pop();
            cnt++;
            if(node->left!=nullptr) q.push(node->left);
            if(node->right!=nullptr) q.push(node->right);
        }
        return cnt;
    }
};

思路3

上面的兩種方法都是使用遍歷來做,沒有使用到完全二叉樹的性質。

完全二叉樹是一棵空樹或者它的葉子節點只出在最後兩層,若最後一層不滿則葉子節點只在最左側。如果每一層的節點都是滿的,則稱為滿二叉樹。對於一個高度為 d 的滿二叉樹來講,樹中節點的個數為 \(2^d-1\)

對於完全二叉樹中的一個節點:

  • 如果該節點左子樹的高度等於該節點右子樹的高度,都是 h,則說明該節點的左子樹是滿的,通過公式 \(2^h-1\) 計算左子樹的節點個數,再加上根節點共 \(2^h\) 個節點,然後遞迴計算右子樹的節點個數;
  • 如果左子樹的高度不等於右子樹的高度,則說明最後一層不滿,但倒數第 2 層滿了,可以通過公式計算右子樹的節點個數並遞迴計算左子樹的節點個數。

程式碼如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if(root==nullptr) return 0;

        int left = getHeight(root->left);
        int right = getHeight(root->right);
        if(left==right){
            return pow(2, left) + countNodes(root->right);
        }else{
            return pow(2, right) + countNodes(root->left);
        }
    }
    
    int getHeight(TreeNode* root){
        if(root==nullptr) return 0;
        return max(getHeight(root->left)+1, getHeight(root->right)+1);
    }
};

參考

https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/chang-gui-jie-fa-he-ji-bai-100de-javajie-fa-by-xia/