L2-011 玩转二叉树

采用的方式和L2-006树的遍历的方式类似,都是使用不建树,只是用递归的方式来得到要输出的数据。

但是一开始的时候,自己没有仔细想二叉树遍历的过程就直接做了。具体的错误做法是,先把当前树的根存到数组中,递归遍历右子树和左子树,将得到的数组当作层序遍历的结果输出。犯的错误是,没有想清楚函数递归调用的过程,遍历左右树的函数不会同时执行。上面这种做法按照 根 -- 右 -- 左 的方式依次遍历整个树,而非期待的层序遍历方式。

正确的方式是再递归函数参数中 增加层数变量,将树递归遍历过程中的根存储在不同层的数组中,最终得到正确的层序遍历结果进行输出。

代码如下:

#include<bits/stdc++.h>

using namespace std;
const int N = 110;

int mid[N],suf[N];
int tr[N][N],len;
int n;


void gettree(int l1,int r1,int l2,int r2,int depth){
	
	
	//cout << l1 << ' ' << r1 << ' ' << l2 << ' ' << r2 << endl;
	if(l1>r1) {
		len = max(len,depth -1);
		return ;
	}
	
	int x = suf[l2];
	
	int top = tr[depth][0];
	
	tr[depth][++top] = x;
	
	tr[depth][0] = top;
	
	int p;
	for(int i=l1;i<=r1;i++){
		if(mid[i]==x){
			p = i;
			break;
		}
	}
	
	
	int llen = p - 1 - l1 + 1;
	int rlen = r1 - (p + 1) + 1;


	gettree(p+1,r1,r2-rlen+1,r2,depth+1);
	gettree(l1,p-1,l2+1,l2+1+llen-1,depth+1);

}



int main(){
	cin >> n ;
	for(int i=1;i<=n;i++){
		cin >> mid[i] ;
	}	
	for(int i=1;i<=n;i++){
		cin >> suf[i] ;
	}
	
	gettree(1,n,1,n,1);
	
	
//	cout << "len:" << len << endl;
	for(int i=1;i<len;i++){
		int l = tr[i][0];
//		cout << i << ' ' << l << endl;
		for(int j=1;j<=l;j++){
			cout << tr[i][j] <<' ' ;
		}
	} 
	int l =tr[len][0];
	for(int i=1;i<l;i++){
		cout << tr[len][i] << ' ' ;
	}
	cout << tr[len][l] << endl;
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值