我是靠谱客的博主 真实鼠标,最近开发中收集的这篇文章主要介绍二叉树-已知两种遍历求第三种,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1,先序和中序,输出后序

#include<iostream>
#include<stack>
using namespace std;
const int N=1010;
int n,pre[N],in[N]; //先序数组和后序数组
stack<int> st;      //存放父节点
void build(int l1,int r1,int l2,int r2) //l1,r1,是先序数组,l2,r2中序数组
{   
    int i,j;
    st.push(pre[l1]);    //父节点入栈
    for(i=l2;i<=r2;i++)
        if(in[i]==pre[l1])  //找到父节点在中序遍历的位置i
            break;
    j=l1+(i-l2+1);      //确定左子树和右子树在先序遍历的分界点j,即右子树的父节点
    if(j<=r1 && i+1<=r2)    //求解右子树
        build(j,r1,i+1,r2);
    if(l1+1<=j-1 && l2<=i-1)    //求解左子树
        build(l1+1,j-1,l2,i-1);
}

int main()
{
	cin>>n;
  	for(int i=0;i<n;i++)
        cin>>pre[i];
    for(int i=0;i<n;i++)
        cin>>in[i];
    build(0,n-1,0,n-1);
    while(!st.empty())
	{
        cout<<st.top()<<" ";   
        st.pop();
    }
    return 0;
}

2,后序和中序,输出先序

#include<iostream>
#include<stack> 
using namespace std;
stack<int>p;
int bac[100],in[100];
void bfs(int l1,int r1,int l2,int r2)//l1,r1中序,l2,r2后序 
{
	cout<<bac[r2]<<" ";
	int i,j;
	for(i=l1;i<=r1;i++)
	{
		if(in[i]==bac[r2])
		break;
	} 
	j=r2-(r1-i+1);
	if(i-1>=l1&&j>=l2)
	bfs(l1,i-1,l2,j);//左子树 
	if(r1>=i+1&&r2-1>=j+1)
	bfs(i+1,r1,j+1,r2-1);//右子树 
}
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>bac[i];
	for(int i=0;i<n;i++)
	cin>>in[i];
	bfs(0,n-1,0,n-1);
} 
/*
8
4 6 5 2 8 7 3 1
4 2 6 5 1 8 3 7
*/


最后

以上就是真实鼠标为你收集整理的二叉树-已知两种遍历求第三种的全部内容,希望文章能够帮你解决二叉树-已知两种遍历求第三种所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部