LeetCode958 二叉树的完全性检验

给定一个二叉树,确定它是否是一个完全二叉树。

百度百科中对完全二叉树的定义如下:

若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)

 

自己用的是本方法,先计算一个深度(一直往左走),可能不是真正的深度但是没关系。对于depth-2的深度的节点直接按层次遍历压入队列,然后每一层开始的时候检验上一层数目是否正确;对于depth-1层就照样压入,遇到第一个nullptr的时候就跳出,检查后面所有的子节点是否都为nullptr;对于depth的节点直接检查是否全为叶子。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 
12 public:
13     bool isCompleteTree(TreeNode* root) {
14         if(root==nullptr)
15             return true;
16         int depth=get_depth(root);
17         queue<TreeNode*> qTree;
18         qTree.push(root);
19         int flag=0, aimlen=1;
20         for(int i=2;i<=depth;++i){
21             if(i<depth-1){
22                 int curlen=qTree.size();
23                 if(curlen!=aimlen )
24                     return false;
25                 for(int j=0;j<curlen;++j){
26                     TreeNode* temp=qTree.front();
27                     qTree.pop();
28                     if(temp->left!=nullptr)
29                         qTree.push(temp->left);
30                     if(temp->right!=nullptr)
31                         qTree.push(temp->right);
32                 }
33                 aimlen*=2;
34             }
35             else if(i==depth-1){
36                 int curlen=qTree.size();
37                 if(curlen!=aimlen )
38                     return false;
39                 int j=0;
40                 for(;j<curlen;++j){
41                     TreeNode* temp=qTree.front();
42                     qTree.pop();
43                     if(temp->left==nullptr){
44                         if(temp->right!=nullptr)
45                             return false;
46                         break;
47                     }
48                     else if(temp->right==nullptr){
49                         qTree.push(temp->left);
50                         break;
51                     }
52                     else{
53                         qTree.push(temp->left);
54                         qTree.push(temp->right);
55                     }
56                 }
57                 for(j=j+1;j<curlen;++j){
58                     TreeNode* temp=qTree.front();
59                     qTree.pop();
60                     if(temp->left!=nullptr || temp->right!=nullptr)
61                         return false;
62                 }
63             }
64             else{
65                 while(!qTree.empty()){
66                     TreeNode* temp=qTree.front();
67                     qTree.pop();
68                     if(temp->left!=nullptr || temp->right!=nullptr)
69                         return false;
70                 }
71             }
72         }
73         return true;
74     }
75 
76     int get_depth(TreeNode* root){
77         int depth=1;
78         while(root!=nullptr){
79             root=root->left;
80             ++depth;
81         }
82         return depth;
83     }
84 };

 

看过答案后发现可以直接用编号检查,因为完全二叉树按照层次遍历刚好是连续的n个数。对于编号为i的节点,他的两个子节点编号分别为2*i,2*i+1;所以只要寻找是否有节点的编号超出了节点个数

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool isCompleteTree(TreeNode* root) {
13         size_ = count(root);
14         bool bOK = true;
15         sovle(root,0, bOK );
16         return bOK;
17     }
18 
19     int count(TreeNode* curr)
20     {
21         if(curr==NULL) return 0;
22         int ans=1;
23         ans+= count(curr->left);
24         ans+= count(curr->right);
25         return ans;
26     }
27 
28     void sovle(TreeNode* curr, int i, bool& bOK)
29     {
30         if(curr==NULL) return;
31 
32         if(curr->left!=NULL)
33         {
34             int left = 2*i+1;
35             if(left>=size_) 
36             {
37                 bOK = false;
38                 return;
39             }
40             sovle(curr->left, left, bOK);
41             if(!bOK) return;
42         }
43         if(curr->right!=NULL)
44         {
45             int right = 2*i+2;
46             if(right>=size_)
47             {
48                 bOK = false;
49                 return;
50             }
51             sovle(curr->right, right, bOK);
52             if(!bOK) return;
53         }
54         
55     }
56 private:
57     int size_;
58 };
59 
60 作者:brucechen135
61 链接:https://leetcode-cn.com/problems/check-completeness-of-a-binary-tree/solution/er-cha-dui-de-jie-gou-xing-by-brucechen135/
62 来源:力扣(LeetCode)
63 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2020-07-17 22:41  __rookie  阅读(155)  评论(0编辑  收藏  举报