二叉树应用题——推算后序遍历序列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
普通的写法:

//Author:PanDaoxi 
#include <iostream>
#include <cstring>
using namespace std;
char pre[101]; //先序 
char in[101];  //中序
struct node{
    
    
	char value; //节点值
	int lchild,rchild; //左右节点 
}data[1001];
int root,cnt; //根位置 cnt节点编号 
int N; //节点个数 
void posOrder(int bt){
    
    
	if(bt){
    
    
		posOrder(data[bt].lchild);
		posOrder(data[bt].rchild);
		cout<<data[bt].value; //后序输出 
	}
	return;
}
//二叉树创建函数 
int create(int preL,int preR,int inL,int inR){
    
    
	int bt=0;
	if(preL>preR) bt=0; //递归 
	else{
    
    
		bt=++cnt; //节点编号增加
		int m; //中序根的下标 
		for(m=inL;m<=inR;m++){
    
    
			//找到根并存留 
			if(in[m]==pre[preL]) break;
		}
		data[bt].value=in[m]; //根给data[bt]
		int numLeft=m-inL; //左子树的个数
		data[bt].lchild=create(preL+1,preL+numLeft,inL,m-1); 
		data[bt].rchild=create(preL+numLeft+1,preR,m+1,inR);
	} 
	return bt;
} 
int main(){
    
    
	cin>>pre>>in;
	N=strlen(pre);
	root=create(0,N-1,0,N-1);
	posOrder(root);
	return 0; 
} 

智慧的写法:
(逻辑性较强)

//Author:PanDaoxi 
#include <iostream>
#include <cstring> 
using namespace std;
string s1,s2;
//后序遍历
void set_up(int l1,int r1,int l2,int r2){
    
    
	int m; //中序根的位置 
	for(m=l2;m<=r2;m++){
    
    
		if(s2[m]==s1[l1]) break;
	}
	if(m>l2) set_up(l1+1,l1+(m-l2),l2,m-1); //左输出
	if(m<r2) set_up(l1+(m-l2)+1,r1,m+1,r2); //右输出
	cout<<s1[l1]; //输出根
	return; 
} 
int main(){
    
    
	cin>>s1>>s2;
	set_up(0,s1.length()-1,0,s2.length()-1); //后序遍历,输出 
	return 0;
}

在这里插入图片描述

Guess you like

Origin blog.csdn.net/PanDaoxi2020/article/details/121729393