Leetcode958. Check Completeness of a Binary Tree二叉樹的完全驗證性
阿新 • • 發佈:2019-01-12
給定一個二叉樹,確定它是否是一個完全二叉樹。
百度百科中對完全二叉樹的定義如下:
若設二叉樹的深度為 h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。(注:第 h 層可能包含 1~ 2h 個節點。)
示例 1:
輸入:[1,2,3,4,5,6] 輸出:true 解釋:最後一層前的每一層都是滿的(即,結點值為 {1} 和 {2,3} 的兩層),且最後一層中的所有結點({4,5,6})都儘可能地向左。
示例 2:
輸入:[1,2,3,4,5,null,7] 輸出:false 解釋:值為 7 的結點沒有儘可能靠向左側。
提示:
- 樹中將會有 1 到 100 個結點。
個人遞迴方法:
class Solution { bool isTheEnd = false; int depth = 0; public: bool isCompleteTree(TreeNode* root) { if (root == NULL) return true; depth = GetDepth(root); return GetAns(root, 1); } int GetDepth(TreeNode *root) { if (root == NULL) return 0; return max(GetDepth(root->left), GetDepth(root->right)) + 1; } bool GetAns(TreeNode *root, int dep) { //只有根節點的情況,不用判空,因為不會遞迴到那 if (dep == depth) { return true; } if (dep < depth - 1) { if (root->left == NULL || root->right == NULL) return false; return GetAns(root->left, dep + 1) && GetAns(root->right, dep + 1); } else if (dep == depth - 1) { if (isTheEnd) { if (root->left != NULL || root->right != NULL) return false; return true; } else { if (root->left == NULL) { if (root->right != NULL) return false; isTheEnd = true; return true; } if (root->right == NULL) { isTheEnd = true; return true; } return true; } } } };
廣度優先遍歷法(推薦):
bool isCompleteTree(TreeNode* root) { queue<TreeNode *> que; que.push(root); while(!que.empty()) { TreeNode * node = que.front(); que.pop(); if(!node) { break; } else { que.push(node->left); que.push(node->right); } } while(!que.empty()) { TreeNode * node=que.front(); if(node) return false; que.pop(); } return true; }