1、思路
对于二叉搜索树的判断,可以在中序遍历时保存前一个节点的值,每次比较当前节点值与前一节点值,若前一节点值较大,则该二叉树不是二叉搜索树;
对于完全二叉树的判断,可以按照以下标准进行:
1、层序遍历二叉树;
2、若当前节点有右子节点却没有左子节点,则直接返回
false;3、若当前节点并不是左右孩子都有,那么之后的节点必须都为叶子结点,否则返回
false;4、遍历过程中若不返回
false,则遍历结束后返回true。
2、代码
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left, *right;
TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
};
//建树
void createTree(TreeNode *root)
{
int rootVal, leftVal, rightVal;
cin >> rootVal >> leftVal >> rightVal;
root->val = rootVal;
if (leftVal != 0)
{
root->left = new TreeNode(leftVal);
createTree(root->left);
}
if (rightVal != 0)
{
root->right = new TreeNode(rightVal);
createTree(root->right);
}
}
//判断二叉搜索树(二叉树中序遍历的迭代版)
bool isBST(TreeNode *root)
{
if (root == nullptr) return true;
stack<TreeNode*> stk;
TreeNode *p = root, *pre = nullptr;
while (p != nullptr || !stk.empty())
{
if (p != nullptr)
{
stk.push(p);
p = p->left;
}
else
{
p = stk.top();
stk.pop();
if (pre != nullptr && pre->val >= p->val)
{
return false;
}
pre = p; //更新前一节点的值
p = p->right;
}
}
return true;
}
//判断完全二叉树(二叉树的层序遍历)
bool isCBT(TreeNode *root)
{
if (root == nullptr) return true;
queue<TreeNode*> q;
q.push(root);
TreeNode *left, *right;
bool isLeaf = false;
while (!q.empty())
{
TreeNode *node = q.front();
q.pop();
left = node->left;
right = node->right;
//情况 2 和 情况 3
if ((isLeaf && (left != nullptr || right != nullptr)) ||
(left == nullptr && right != nullptr))
{
return false;
}
if (left != nullptr)
{
q.push(left);
}
if (right != nullptr)
{
q.push(right);
}
else
{
//若没有右子树,则该节点之后的所有节点均为叶子节点
isLeaf = true;
}
}
return true;
}
int main()
{
int n, rootVal;
cin >> n >> rootVal;
TreeNode *root = new TreeNode(rootVal);
createTree(root);
if (isBST(root))
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
if (isCBT(root))
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
return 0;
}

京公网安备 11010502036488号