转向我的博客地址
题目描述
给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
示例1
输入:
{2,1,3}
输出
[true,true]
备注:
n≤500000
其中,判断搜索二叉树,只需要中序遍历一次,取出值,看是否是递增即可。
判断是否是完全二叉树,只需要按层遍历一次,找到第一个null的节点即可。创建一个队列,进行存储,存储每一个节点,然后按顺序拿出来,找到第一个null的节点,意味着后面的拿出来的节点,不可能不是null。
我的错误:
在搜索二叉树里面,将vector创建的vc放到了函数里面,没有创建全局的,导致出现vc存入出错。
以后:尽量这种还是创建全局,比较方便,和不容易错误!记录!
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类 the root
* @return bool布尔型vector
*/
vector<int> vc22;//存储中序遍历结果
void middle(TreeNode* head){//中序遍历
if(head->left != nullptr) middle(head->left);
vc22.push_back(head->val);
if(head->right != nullptr) middle(head->right);
}
bool isSouSuo(TreeNode* head){//搜索二叉树判断
if(head == nullptr) return true;//空,一定是搜索二叉树
middle(head);//中序遍历一次
//判断值是否递增上涨
for(int i = 1; i < vc22.size(); i++){
if(vc22[i] < vc22[i - 1]) return false;
}
return true;
}
//判断是否是完全二叉树
/*
完全二叉树考虑层次遍历出现的第一个空节点!
*/
bool isWanQuan(TreeNode *head){
if(head == nullptr) return true;//如果是空,则一定是
queue<TreeNode*> que;//设计一个队列进行存储
que.push(head);//先将头存入
TreeNode* p;
bool notComplete = false;//是否开始出现null
while(!que.empty()){//如果不是空,就要一直循环
p = que.front();//取出队列第一个
que.pop();
if(p == nullptr) {//如果是空,则左孩子已经没了,标记一下
notComplete = true;
continue;
}
if(notComplete) return false;//如果是true,前面的应该是有null,该节点不是null,说明不是完全二叉树
//左右两孩子,即便是null,也存入。
que.push(p->left);
que.push(p->right);
}
return true;
}
vector<bool> judgeIt(TreeNode* root) {
// write code here
vector<bool> vc;
vc.push_back(isSouSuo(root));
vc.push_back(isWanQuan(root));
return vc;
}
};