Leetcode 222:完全二叉樹的節點個數
阿新 • • 發佈:2019-05-13
根節點 定義 如果 turn pri def class lee ^h
題目
給出一個完全二叉樹,求出該樹的節點個數。
說明:
完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其余每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若幹位置。若最底層為第 h 層,則該層包含 1~ 2^h 個節點。
思路
1.如果一棵二叉樹是完全二叉樹,那麽二叉樹最大深度和右子樹的最大深度是相同的話,那麽根節點的左子樹一定是一棵滿二叉樹,利用公式即可求出根節點的左子樹的節點加上根節點的節點數量。 2.如果一棵二叉樹是完全二叉樹,那麽二叉樹最大深度和右子樹的最大深度是不同的話(實際情況就是二叉樹的最大深度比其右子樹的最大深度大1),那麽右子樹一定是深度 為二叉樹深度減2的滿二叉樹。 由上述內容可知,一棵完全二叉樹左右子樹中至少一個是滿二叉樹。
題解
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ //https://www.jianshu.com/p/62db7c855e44 class Solution { private: int height(TreeNode* root){ if(root == NULL) return -1; while(root != NULL) return height(root->left) + 1; } public: int countNodes(TreeNode* root) { int h=height(root); int nums=0; while(root!=NULL){ if(h-1==height(root->right)){ nums+=1<<h; //相當於pow(2,h - 1) root=root->right; } else{ nums+=1<<h-1; root=root->left; } h--; } return nums; } };
reference
- 0222-Count Complete Tree Nodes
Leetcode 222:完全二叉樹的節點個數