1043. Is It a Binary Search Tree (25)

1.通过前缀遍历的数组,建立可能的BST或者镜像BST

2.写两个函数,分别用来建立正常的BST:dfs和镜像BST:dfsMirror

3.如果使用dfs不能建立BST,那么使用dfsMirror进行建立,两者都不能建立,则输出NO


//#include<string>
//#include <iomanip>
#include<vector>
#include <algorithm>
//#include<stack>
#include<set>
#include<queue>
#include<map>
//#include<unordered_set>
#include<unordered_map>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
struct TreeNode{
	int val;
	TreeNode *l, *r;
	TreeNode(int x) :val(x), l(NULL), r(NULL){};
	TreeNode() :val(-1), l(NULL), r(NULL){};
};
TreeNode*dfs(vector<int>&node, int l, int r, bool&buildSuccess)
{//建立正常的BST
	if (l>r) return NULL;
	else if (l == r)
	{
		return new TreeNode(node[l]);
	}
	else
	{
		TreeNode* root = new TreeNode(node[l]);
		int i = l + 1;
		while (i <= r&&node[i]<root->val)
		{
			i++;
		}
		int j = i;
		while (j <= r&&node[j] >= root->val)
		{
			j++;
		}
		if (i != r + 1 && j != r + 1)
		{//如果i没有达到最终点且j也没有到达最终点,证明数组里面有部分点不满足要求,所以不能构建
			buildSuccess = false;
			return NULL;
		}
		root->l = dfs(node, l + 1, i - 1, buildSuccess);
		root->r = dfs(node, i, r, buildSuccess);
		return root;
	}
}


TreeNode*dfsMirror(vector<int>&node, int l, int r, bool&buildSuccess)
{//基本同上
	if (l>r) return NULL;
	else if (l == r)
	{
		return new TreeNode(node[l]);
	}
	else
	{
		TreeNode* root = new TreeNode(node[l]);
		int i = l + 1;
		while (i <= r&&node[i] >= root->val)
		{
			i++;
		}
		int j = i;
		while (j <= r&&node[j]<root->val)
		{
			j++;
		}
		if (i != r + 1 && j != r + 1)
		{
			buildSuccess = false;
			return NULL;
		}
		root->l = dfsMirror(node, l + 1, i - 1, buildSuccess);
		root->r = dfsMirror(node, i, r, buildSuccess);
		return root;
	}
}

void postOrderDFS(TreeNode*root, vector<int>&postOrder)
{
	if (root != NULL)
	{
		postOrderDFS(root->l, postOrder);
		postOrderDFS(root->r, postOrder);
		postOrder.push_back(root->val);
	}
}
/*
7 8 6 5 7 10 8 11

7 8 10 11 8 6 7 5

7 8 6 8 5 10 9 11
*/
int main(void)
{

	int nodeSum;
	cin >> nodeSum;
	vector<int> node(nodeSum);
	for (int i = 0; i<nodeSum; i++)
	{
		scanf("%d", &node[i]);
	}
	bool buildSuccess = true;
	TreeNode*tree = dfs(node, 0, (int)(node.size() - 1), buildSuccess);
	if (!buildSuccess)
	{
		buildSuccess = true;
		tree = dfsMirror(node, 0, (int)(node.size() - 1), buildSuccess);
	}
	if (buildSuccess)
	{
		cout << "YES" << endl;
		vector<int> postOrder(0);
		postOrderDFS(tree, postOrder);
		for (int i = 0; i<postOrder.size(); i++)
		{
			cout << postOrder[i];
			if (i != postOrder.size() - 1)
				cout << " ";
		}
		cout << endl;
	}
	else
		cout << "NO" << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值