中序和后序确定二叉树 以及 二叉树的递归遍历

树:Uva548

中序和后序确定二叉树 以及 二叉树的递归遍历_第1张图片

__________________https://blog.csdn.net/yexiaohhjk/article/details/50519453

 

样例输入:

3 2 1 4 5 7 6

3 1 2 5 6 7 4

7 8 11 3 5 16 12 18

8 3 11 716 18 12 5

255

255

样例输出

1

3

255

 

 

1、给定中序和后序(或先序),都能唯一确定一个二叉树。

node* creat_tree(int m1,int n1,int m2,int n2)
{    
    if (m1>n1) return NULL;//m==n时,建立叶子节点
    int tmp=PostOrder[n2];
    int i=find(InOrder.begin(),InOrder.end(),tmp)-InOrder.begin();
    cout<     int cnt=i-m1;//表示共有多少左子树
    node *u=new node;
    u->v=tmp;
    u->left=creat_tree(m1,i-1,m2,m2+cnt-1);
    u->right=creat_tree(i+1,n1,m2+cnt,n2-1);

    return u;
}

 

2、深度递归遍历二叉树

void dfs(node *u,int sum)
{
    sum+=u->v;
    if(!u->left&&!u->right)
        if(sumv         {
            best_sum=sum;
            isum=u->v;
        }
    if(u->left) dfs(u->left,sum);
    if(u->right) dfs(u->right,sum);

}

 

3、释放动态生成的空间

void remove_tree(node *u)
{
    if(u==NULL) return;
    remove_tree(u->left);
    remove_tree(u->right);
    delete u;
}

 

 

整体代码:

#include
#include
#include
#include 
using namespace std;

struct node
{
	int v;
	node *left;
	node *right;
	node():v(0),left(NULL),right(NULL){}
};

node *root;
int best_sum=INT_MAX;//最小的和
int isum=INT_MAX;// 最小和时的下标 
int a1[]={7,8,11,3,5,16,12,18};
int a2[]={8,3,11,7,16,18,12,5};
vector InOrder(a1,a1+sizeof(a1)/sizeof(int));
vector PostOrder(a2,a2+sizeof(a2)/sizeof(int));

/*
node* creat_tree(int m,int n)
{	
	if (m>n) return NULL;//m==n时,建立叶子节点 
	int tmp=PostOrder[n];
	int i=find(InOrder.begin(),InOrder.end(),tmp)-InOrder.begin();
	cout<v=tmp;
	u->left=creat_tree(m,i-1);
	u->right=creat_tree(i+1,n);
	return u;
}
*/


node* creat_tree(int m1,int n1,int m2,int n2)
{	
	if (m1>n1) return NULL;//m==n时,建立叶子节点 
	int tmp=PostOrder[n2];
	int i=find(InOrder.begin(),InOrder.end(),tmp)-InOrder.begin();
	cout<v=tmp;
	u->left=creat_tree(m1,i-1,m2,m2+cnt-1);
	u->right=creat_tree(i+1,n1,m2+cnt,n2-1);
	return u;
}

void dfs(node *u,int sum)
{
	sum+=u->v;
	if(!u->left&&!u->right)
		if(sumvv;
		}
	if(u->left) dfs(u->left,sum);
	if(u->right) dfs(u->right,sum);
} 

void remove_tree(node *u)
{
	if(u==NULL) return;
	remove_tree(u->left);
	remove_tree(u->right);
	delete u;
}

int main()
{
	root=creat_tree(0,InOrder.size()-1,0,PostOrder.size()-1);
	dfs(root,0);
	cout<

 

 

你可能感兴趣的:(数据结构)