题目链接
题目描述
给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
输入
{2,1,3}
输出
[true,true]
备注:
n≤500000
思路
判断二叉搜索树:中序遍历,每次比较当前节点p和前一个遍历到的节点pre的值,如果p->val小于pre->val说明中序遍历的序列不符合从小到大排列,不是二叉搜索树。
完全二叉树和满二叉树不同,完全二叉树满足以下条件:
- 叶子节点都在最后一层或者倒数第二层
- 叶子节点都向左聚拢
判断完全二叉树:层次遍历,如果某个子节点为空,则标记flag为true,后面如果还有非空的子节点且flag已经为true了,说明必定不是完全二叉树。
完整代码如下:
class Solution {
public:
TreeNode *pre;
//判断是否二叉搜索树
bool ifSearch(TreeNode *p){
if(!p)
return true;
bool ret=ifSearch(p->left);
if(pre&&p->val<pre->val)
ret&=false;
pre=p;
ret&=ifSearch(p->right);
return ret;
}
//判断是否完全二叉树
bool ifComplete(TreeNode *p){
queue<TreeNode*> q;
q.push(p);
bool flag=false;
while(!q.empty()){
auto t=q.front();
q.pop();
if(!t->left)
flag=true;
else if(t->left&&flag)
return false;
else
q.push(t->left);
if(!t->right)
flag=true;
else if(t->right&&flag)
return false;
else
q.push(t->right);
}
return true;
}
vector<bool> judgeIt(TreeNode* root) {
pre=NULL;
return vector<bool>{ifSearch(root),ifComplete(root)};
}
};
版权声明:本文为weixin_44164489原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。