- 根据完全二叉树的特征:
a. 左子树和右子树深度差值小于等于1
b. 左子树比右子树深时,右子树时满树
c. 左右子书一样深,左子树是满树
d. 任意子树不存在right heavy的情况,右子树节点个数不大于左子树
/**
* 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 getDepth(TreeNode *root, int depth) {
if (!root) return depth;
depth += 1;
int left = getDepth(root->left, depth);
int right = getDepth(root->right, depth);
return left > right ? left : right;
}
bool isFull(TreeNode *root, int depth) {
if (!root) return true;
int left = getDepth(root->left, depth);
int right = getDepth(root->right, depth);
bool flag = (left == right ? true : false);
return flag && isFull(root->left, depth) && isFull(root->right, depth);
}
bool isRightHeavy(TreeNode *root) {
if (!root) return false;
int leftCnt = getCnt(root->left);
int rightCnt = getCnt(root->right);
bool flag = leftCnt < rightCnt ? true : false;
return flag || isRightHeavy(root->left) || isRightHeavy(root->right);
}
int getCnt(TreeNode *root) {
if (!root) return 0;
return 1 + getCnt(root->left) + getCnt(root->right);
}
bool isCompleteTree(TreeNode* root) {
if (!root) return true;
int depth = 1;
int leftDepth = getDepth(root->left, depth);
int rightDepth = getDepth(root->right, depth);
bool flag = true;
if (abs(leftDepth - rightDepth) > 1) {
flag = false;
}
else if (leftDepth < rightDepth) {
flag = false;
}
else if (leftDepth > rightDepth) {
flag = isCompleteTree(root->left) && isFull(root->right, depth);
}
else if (leftDepth == rightDepth) {
if (isRightHeavy(root) || !isFull(root->left, 0))
flag = false;
else
flag = true;
}
return flag && isCompleteTree(root->left) && isCompleteTree(root->right);
}
};
- 层序遍历方法:
完全二叉树遇到第一个非空节点,后面都是非空节点。通过遇到第一个空节点停止层序遍历,查看其后是否还有非空节点
/**
* 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:
void seqtrav(TreeNode *root, queue<TreeNode*> &q) {
q.push(root);
while(q.front()) {
root = q.front();
q.pop();
q.push(root->left);
q.push(root->right);
}
}
bool isCompleteTree(TreeNode* root) {
if (!root) return true;
queue<TreeNode*> q;
seqtrav(root, q);
while(!q.empty()) {
if (q.front()) return false;
q.pop();
}
return true;
}
};