【学习笔记】树形结构基础

目的

mark一下紫书上的例题与操作,以备复习。


内容

各种套路

UVa 122

#include <bits/stdc++.h>
using namespace std;
char s[1007];
struct Node
{
	bool have_value; int v;
	Node *left,*right;
	Node():have_value(false),left(NULL),right(NULL){}
};
bool failed;
Node* root;
Node* newnode() { return new Node();}
void remove_tree(Node* u)
{
  if(u == NULL) return;
  remove_tree(u->left);
  remove_tree(u->right);
  delete u;
}
void addnode(int v,char* s)
{
	int n=strlen(s);
	Node* u=root;		//根节点 
	for(int i=0;i<n;i++)
	{
		if(s[i]=='L')
		{
			if(u->left==NULL) u->left=newnode();
			u=u->left;	//向左走 
		}
		else if(s[i]=='R')
		{
			if(u->right==NULL) u->right=newnode();
			u=u->right;
		}
	}
	if(u->have_value) failed=true;
	u->v =v;
	u->have_value=true;
}
bool read_input()
{
	failed=false;
	root=newnode();
	for(;;)
	{
		if(scanf("%s",s) != 1) return false;
		if(!strcmp(s,"()")) break;
		int v;
		sscanf(&s[1],"%d",&v);
		addnode(v,strchr(s,',')+1); 
	}
	return true;
}
bool bfs(vector<int>& ans)
{
	queue<Node*> q;
	ans.clear();
	q.push(root);
	while(!q.empty())
	{
		Node* u=q.front(); q.pop();
		if(!u->have_value) return false;
		ans.push_back(u->v);
		if(u->left != NULL) q.push(u->left);
		if(u->right != NULL) q.push(u->right);
	}
	return true;
}
int main()
{
	vector<int> ans;
  	while(read_input())
	{
		if(!bfs(ans)) failed = 1;
		if(failed) printf("not complete\n");
		else 
		{
      		for(int i = 0; i < ans.size(); i++)
			{
    	    	if(i != 0) printf(" ");
       			printf("%d", ans[i]);
      		}
      		puts("");
    	}
  	}
  	return 0;
}

UVa 548

#include <bits/stdc++.h>
using namespace std;
const int maxv=10009;
int in_order[maxv],post_order[maxv],lch[maxv],rch[maxv],n;
bool read_list(int* a)
{
	string line;
	if(!getline(cin,line)) return false;
	stringstream ss(line);
	n=0;
	int x;
	while(ss>>x) a[n++]=x;
	return n>0;
}
//把in_order[L1,R1]和post_order[L2,R2]建成一颗二叉树,返回树根 
int build(int L1,int R1,int L2,int R2)
{
	if(L1>R1) return 0;
	int root=post_order[R2];
	int p=L1;
	while(in_order[p] != root) p++; 
	int cnt=p-L1;
	lch[root]=build(L1,p-1,L2,L2+cnt-1);
	rch[root]=build(p+1,R1,L2+cnt,R2-1);
	return root;
}
long long best,best_sum;
void dfs(int u,long long sum)
{
	sum+=u;
	if(!lch[u] && !rch[u])
		if(sum<best_sum || (sum==best_sum && u<best))
		{
			best=u;best_sum=sum;
		}
	if(lch[u]) dfs(lch[u],sum);
	if(rch[u]) dfs(rch[u],sum);
}
int main()
{
	while(read_list(in_order))
	{
		read_list(post_order);
		build(0,n-1,0,n-1);
		best_sum=1000000000000;
		dfs(post_order[n-1],0);
		cout<<best<<"\n";
	}
	return 0;
}

UVa 839

#include <iostream>
using namespace std;
int solve(int& W)
{
	int B1=1,B2=1,W1,W2,D1,D2;
	cin>>W1>>D1>>W2>>D2;
	if(!W1) B1=solve(W1);
	if(!W2) B2=solve(W2);
	W=W1+W2;
	if(B1&&B2&&W1*D1==W2*D2) return 1;
	return 0;
}
int main()
{
	int T,W;
	cin>>T;
	while(T--)
	{
		if(solve(W)) cout<<"YES\n";
		else cout<<"NO\n";
		if(T) cout<<"\n";
	}
	return 0;
}

UVa 10562

#include <bits/stdc++.h>
using namespace std;
const int maxn=210;
int n;
char buf[maxn][maxn];
void dfs(int r,int c)
{
	printf("%c(",buf[r][c]);
	if(r+1<n && buf[r+1][c]=='|')
	{
		int i=c;
		while(i-1>=0 && buf[r+2][i-1]=='-') i--;
		while(buf[r+2][i]=='-' && buf[r+3][i]!='\0')
		{
			if(!isspace(buf[r+3][i])) dfs(r+3,i);
			i++;
		}
	}
	printf(")");
}
void solve()
{
	n=0;
	for(;;)
	{
		fgets(buf[n],maxn,stdin);
		if(buf[n][0]=='#') break;
		else n++;
	}
	printf("(");
	if(n)
	{
		for(int i=0;i<strlen(buf[0]);i++)
			if(buf[0][i]!=' ')
			{
				dfs(0,i); break;
			}
	}
	printf(")\n");
}
int main()
{
	int T;
	fgets(buf[0],maxn,stdin);
	sscanf(buf[0],"%d",&T);
	while(T--)
	{
		solve();
	}
	return 0;
}
posted @ 2017-12-04 20:40  noble_(noblex)  阅读(576)  评论(0编辑  收藏  举报
/* */