1.问题整体复制让你快速找到我
【问题描述】课后作业第6题。试写一个判别给定二叉树是否为二叉排序树的算法。以前序遍历序列和中序遍历序列给出该二叉树的结点,并创建该二叉树。然后再进行判断。请注意,树中结点关键字可能相同。
【样例输入1】
6 4 5 8 6 9 0
4 5 6 6 8 9 0
【样例输出1】
true
【样例输入2】
6 4 7 8 0
4 7 6 8 0
【样例输出2】
false
【提示】若直接根据给定的中序是否有序来进行判断,此种判断方法不得分。务必先创建二叉树的链式存储,再对其进行判断。
2.不废话,先复制代码
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
typedef struct treenode
{
int data;
treenode* left;
treenode* right;
treenode(int x) :data(x), left(nullptr), right(nullptr) {}
}treenode;
treenode* build(vector<int> pre, vector<int> mid, int pstart, int pend, int mstart, int mend)
{
if (pstart > pend || mstart > mend)
{
return nullptr;
}
treenode* root = new treenode(pre[pstart]);
int mid1 = mstart;
while (mid[mid1] != pre[pstart])
{
mid1++;
}
int leftsize = mid1 - mstart;
root->left = build(pre, mid, pstart + 1, pstart + leftsize, mstart, mid1 - 1);
root->right = build(pre, mid, pstart + leftsize + 1, pend, mid1 + 1, mend);
return root;
}
int prev1 = -9999;
bool judge(treenode* root)
{
if (root == nullptr)
{
return true;
}
bool left1=judge(root->left);
bool cur = false;
if (root->data >= prev1)
{
cur = true;
}
prev1 = root->data;
bool right1 = judge(root->right);
return left1 && right1 && cur;
}
int main()
{
vector<int> a;
vector<int> b;
int val=-9;
while (1)
{
cin >> val;
if (val == 0)
{
break;
}
a.push_back(val);
}
val = -9;
while (1)
{
cin >> val;
if (val == 0)
{
break;
}
b.push_back(val);
}
treenode* root = build(a, b, 0, a.size() - 1, 0, b.size() - 1);
bool flag = judge(root);
if (flag == true)
{
printf("true");
}
else
{
printf("false");
}
return 0;
}
3.简单聊聊思想
首先根据前序遍历和中序遍历构建二叉树,也就是漫话算法:已知二叉树的两种遍历构建二叉树-CSDN博客
然后进行二叉搜索树验证