先序求二叉树

P1030 先序求二叉树

题的意思也比较好理解,就是给出中序和后序遍历的次序,让你输出树的前序遍历的次序。


科普区

树的结点构造

struct node{
	int val;
	node *left;
	node *right;
};
node *root;

 

树的前序遍历

从根节点开始,按找先访问父母结点,再访问左子树和右子树的顺序规则,一直遍历到空结点就结束当前子树的遍历。

void preoder(node *n){
	if(node==NULL)//当前结点为空
		return;
	cout<<n->val<<" ";
	preoder(n->left);//访问左子树
	preoder(n->right);//访问右子树
}
void preoder(){
	preoder(root);
}

树的中序遍历

从根节点开始,按找先访问左子树,再访问父母结点,最后访问右子树的顺序规则,一直遍历到空结点就结束当前子树的遍历。

void inoder(node *n){
	if(node==NULL)//当前结点为空
		return;
	inoder(n->left);//访问左子树
	cout<<n->val<<" ";
	inoder(n->right);//访问右子树
}
void inoder(){
	inoder(root);
}

 

树的后序遍历

从根节点开始,按找先访问左子树,再访问右树,最后访问父母结点的顺序规则,一直遍历到空结点就结束当前子树的遍历。

void postoder(node *n){
	if(node==NULL)//当前结点为空
		return;
	postoder(n->left);//访问左子树
	cout<<n->val<<" ";
	postoder(n->right);//访问右子树
}
void postoder(){
	postoder(root);
}

主要就是两个算法,一个时用二分查找,求出树的结点个数,另一个就是深度优先搜索算法。算法流程在注释中解释的很清楚,废话不多说,就直接粘代码吧!

#include<bits/stdc++.h>
using namespace std;
const int MAXN=10;//最大数据规模
char a[MAXN];//存放中序序列
char b[MAXN];//存放后序序列

void dfs(int left,int right,int cur) {
	//当前子树的左右left指针和right指针相等时,表示当前
	if(left==right) {
		cout<<b[cur];//输出当前结点的值
		return;
	}
	//从左向右依次查找后序遍历cur结点值与中序遍历i结点值是否相等
	for(int i=left; i<=right; i++) {
		//结点值相等时
		if(a[i]==b[cur]) {
			cout<<b[cur];//输出后序遍历的值
			int k=right-i+1;//求出中序遍历的k值
			dfs(left,i-1,cur-k);//搜索左子树
			dfs(i+1,right,cur-1);//搜索右子树
			break;
		}
	}
}
//求取数的结点数
int get_len() {
	int left=0,right=MAXN-1;
	int  mid;
	//二分查找
	while(left<=right) {
		mid=(left+right)/2;
		//判断当前mid结点是否为需要树的最后结点的下标
		if((b[mid]!='\0' && b[mid]!='\n') && (b[mid+1]=='\0' || b[mid+1]=='\n'))
			return mid;
		if(b[mid]>='A' && b[mid]<='Z') {
			left=mid+1;
		} else {
			right=mid-1;
		}
	}
	return mid;
}
int main() {
	cin>>a;
	cin>>b;
	int len=get_len();
	dfs(0,len,len);
	cout<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值