华农专业课拯救计划:利用前序与中序遍历建树并判断是否是二叉排序树

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博客

然后进行二叉搜索树验证

力扣全局变量递归:验证二叉搜索树-CSDN博客

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值