题解 | #判断一棵二叉树是否为搜索二叉树和完全二叉树#
判断一棵二叉树是否为搜索二叉树和完全二叉树
https://www.nowcoder.com/practice/f31fc6d3caf24e7f8b4deb5cd9b5fa97
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
#include <vector>
class Solution {
public:
/**
*
* @param root TreeNode类 the root
* @return bool布尔型vector
*/
bool absoluteTree(TreeNode* u)
{
if(!u) return true;
queue<TreeNode*> q;
vector<TreeNode*> v;
q.push(u), v.push_back(u);
while(!q.empty())
{
auto x=q.front();
q.pop();
if(x->left) q.push(x->left), v.push_back(x->left);
if(x->right) q.push(x->right), v.push_back(x->right);
}
int i=0;
while(i<v.size() && v[i]->left && v[i]->right) i++; //前面的都是有左右子树的节点
if(i>=v.size()) return true; //若这里已经遍历完了说明是满二叉树
if(v[i]->right) return false; // 中间那个节点不能只有右子树
for(i=i+1;i<v.size();i++) // 执行到这里说明后面的都必须是叶子节点
if(v[i]->left || v[i]->right) return false;
return true;
}
bool searchTree(TreeNode* u, int l, int r)
{
if(!u) return true;
if(u->val <= l || u->val >=r) return false;
return searchTree(u->left, l, u->val) && searchTree(u->right, u->val, r);
}
vector<bool> judgeIt(TreeNode* root) {
return {searchTree(root, INT_MIN, INT_MAX) , absoluteTree(root)};
}
};
### 思路
- 判断搜索二叉树,递归判断即可。dfs(u,l,r),u表示子树的根节点,l和r分别为该子树的范围(根节点的范围)
* 判断根节点是否在反问内,若不在直接返回false
* 判断左右子树是否在范围内(若存在):左子树:dfs(u->left, l, u->val) ; 右子树:dfs(u->right, u->val, r)
bool searchTree(TreeNode* u, int l, int r)
{
if(!u) return true;
if(u->val <= l || u->val >=r) return false;
return searchTree(u->left, l, u->val) && searchTree(u->right, u->val, r);
}
- 判断完全二叉树。我们可以发现在完全二叉树的层序遍历中,前面的节点都有左右子树,中间可能存在一个只有一个子树的节点(只能是左子树),之后全是叶子节点。
- 因此可以将二叉树的层序遍历存储在vector中,然后检查vector中的元素是否满足上述条件。注意层序遍历需要一个queue,若想节省空间也可以用vector模拟队列
查看2道真题和解析
海康威视公司福利 1170人发布