アイデア:
ここでは完全な二分木のアイデアについてのみ話します。私のブログを読んで二分木を検索できます。クリックしてください。
完全な二分木は、次の手順に従って問題を解決できます。
- レイヤー順にトラバースし、すべてのノードを各レイヤーの左から右に順番にトラバースします
- 現在のノードに右の子ノードがあり、左の子ノードがない場合は、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;//中序遍历序列
};