思路:
这里只讲完全二叉树的思路,搜索二叉树可以看我这篇博客,请点击!
完全二叉树按照以下步骤解题即可:
- 按层序遍历,从每层的左边向右边依次遍历所有的节点
- 如果当前的节点有右孩子节点,但是没有左孩子节点,直接返回false
- 如果当前节点并不是左右孩子节点全有,那么之后的节点必须都为叶节点,否则直接返回false
- 遍历过程中如果不返回false,则遍历结束以后返回true
代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
vector<bool> judgeIt(TreeNode* root) {
// write code here
vector<bool> res{true,true};
if (!root) return res;
inOrder(root);
for(int i = 1;i<midSeq.size();++i) //检查是否升序序列
if (midSeq[i] < midSeq[i - 1]) {
res[0] = false;
break;
}
res[1] = isComplete(root);
return res;
}
void inOrder(TreeNode* root) { //中序遍历
if (root == nullptr) return;
inOrder(root->left);
midSeq.emplace_back(root->val);
inOrder(root->right);
}
bool isComplete(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
TreeNode* left ,* right;
bool leaf = false;
while(q.size()){
auto it = q.front();
q.pop();
left = it->left;
right = it->right;
if(leaf && (left!=NULL || right!=NULL)) return false;//这种情况只有当leaf为true时才会进行判断
if(left==NULL && right!=NULL) return false;
if(left!=NULL) q.push(left);
if(right!=NULL) q.push(right);
else leaf = true; //表示该节点之后的所有节点应该都是叶子节点才符合完全二叉树的定义。
}
return true;
}
private:
vector<int> midSeq;//中序遍历序列
};