中序遍历树并判断是否为二叉搜索树(指针)

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h> 
#include <sstream>
#include <queue>
#include <vector>
#include <map>
#include <unordered_map>
#include <set> // multi可重复, lower_bound()返回的是第一个大于等于x的迭代器,若没有,返回end();
using namespace std;
/* Week = (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7 */
/* P(AUB)=P(A)+P(B)-P(AB) 任意事件概率的加法公式 */
/* A(mn) = n!/(n-m)!  C(mn) = A(mn)/m!; 排列组合 */
/* (x[2]-x[1])*(y[3]-y[2]) - (y[2]-y[1])*(x[3]-x[2]); 判断3个点的顺逆 */
typedef long long ll;




struct node{
	int var;
	node *L = NULL, *R = NULL;
};
int n, root;
int r, d, e;
map<int, node*> mp;

void insert(node *&p, int r, int d, int e){
	if(p == NULL){
		p = new node();
		p->var = e;
		mp[e] = p; // map存当前值的地址,方便下次能直接跑
		return ;
	}
	if(p->var == r){
		if(d == 0){
			insert(p->L, r, d, e);
		}
		else{
			insert(p->R, r, d, e);
		} 
	}
}

bool flag = true;
void dfs(node *p){
	if(p->L != NULL){
		if(p->L->var > p->var)flag = false;
		dfs(p->L);
	}
	
	cout << p->var << endl;
	
	if(p->R != NULL){
		if(p->R->var < p->var)flag = false;
		dfs(p->R);
	}
}
int main(){
	ios::sync_with_stdio(false);
	node *p = NULL;
	cin >> n;
	if(n == 0){
		cout << "Yes\n";
		return 0;//恶心人 
	}
	cin >> root;
	
	insert(p,0,0,root);
	for(int i = 1; i < n; i ++){
		cin >> r >> d >> e;
		insert(mp[r], r, d, e);
	}
	dfs(p);
	if(flag == true)cout << "Yes\n";
	else cout << "No\n";
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值