题解 | #判断一棵二叉树是否为搜索二叉树和完全二叉树#
判断一棵二叉树是否为搜索二叉树和完全二叉树
http://www.nowcoder.com/practice/f31fc6d3caf24e7f8b4deb5cd9b5fa97
- 对于是否为BST,中序遍历递增就行(不能有等号)
- 对于是否为Full,层序遍历,添加是否第一次遇到empty就行,如果第二次在有子树的时候,遇到了empty=true,那就是不满足。因为我们遍历时先左后右得。而满二叉树只允许最右边的有一个孩子的时候且必须在左边。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
TreeNode* pre = new TreeNode(-1000000);//作为假的第一个节点
bool ISBST(TreeNode* root){
if(!root) return true;// 结点为空返回true
bool left = ISBST(root->left);// 判断左子树是否有序
bool cur = pre->val < root ->val;// 判断当前节点是否有序
pre = root;// 按中序遍历,记录前一个指针
bool right = ISBST(root->right);// 判断右子树是否有序
return left&&cur&&right;
}
//层序遍历
bool ISFULL(TreeNode* root){
if(!root) return true;
bool isEmpty = false;//遇到得第一个空树。(如果是最后遇到的,没有一点问题,但是在中途遇到,就会有问题)
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* node= q.front();
q.pop();
if(node->left){
if(isEmpty) return false; // 前面遇到空节点,此次还遇到了非空节点返回 false
q.push(node->left);
}else isEmpty = true;//此次遇到了空节点
//如果左空右不空,也是false
if(node->right){
if(isEmpty) return false; // 前面遇到空节点,此次还遇到了非空节点返回 false
q.push(node->right);
}else isEmpty = true;//此次遇到了空节点
}
return true;
}
/**
*
* @param root TreeNode类 the root
* @return bool布尔型vector
*/
vector<bool> judgeIt(TreeNode* root) {
// write code here
bool r1 = ISBST(root);
bool r2 = ISFULL(root);
return {r1,r2};
}
}; 算法解析 文章被收录于专栏
这里主要是算法岗的自我思路总结

