您的位置:首页 > 其它

548 - Tree uva - 深搜 + 建树

2014-04-15 01:06 369 查看
参考:

/article/1632576.html

// 由中序和后序遍历序列进行建树, 返回根结点指针
Node * InPostCreateTree(int *mid,int *post,int len){
	if(len == 0)
		return NULL;
	int i=len-1;
    while(post[len-1] != mid[i])
		--i;
	Node *h=NewNode();
	h->data=post[len-1];
	h->left=InPostCreateTree(mid,post,i);
	h->right=InPostCreateTree(mid+i+1,post+i,len-i-1);
	return h;
}
 
// 由前序和中序遍历序列进行建树, 返回根结点的指针
Node * PreInCreateTree(int *mid,int *pre,int len)	//n标识s2的长度
{ 
    if(len==0)
    	return NULL;
    
    int i = 0;
    while(*mid != pre[i])
	++i;

    Node *h=NewNode();
    h->data= *mid;
    h->left  = PreInCreateTree(mid+1, pre, i);
    h->right = PreInCreateTree(mid+i+1, pre+i+1, len-i-1);
    return h;
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<malloc.h>
#include<algorithm>
using namespace std;
#define MAX_SIZE 10000 + 100
struct Tree
{
    int value;
    Tree *left;
    Tree *right;
} ;
int n;
int MAX;
int fin;
int mid[MAX_SIZE] , post[MAX_SIZE];
Tree *BuildTree(int *mid,int *post,int len){
    if( len == 0 )
    return NULL;
    int pos = len - 1;
    Tree * node;
    node = (Tree *)malloc(sizeof(Tree));
    while(post[len-1]!=mid[pos])
        pos--;
    node->value = post[len-1];
    node ->left  = BuildTree(mid,post,pos);
    node ->right = BuildTree(mid+pos+1,post+pos,len-pos-1);
    
    return node;
}
void dfs(Tree *node,int sum){/*深度遍历*/
    if(node->left!=NULL){
        sum+=(node->left)->value;
        dfs(node->left,sum);
        sum-=(node->left)->value;
    }
    if(node->right!=NULL){
        sum+=(node->right)->value;
        dfs(node->right,sum);
        sum-=(node->right)->value;
    }
    if(node->left==NULL&&node->right==NULL){
            if(sum<MAX){
           MAX=sum;
           fin=node->value;
        }
        else if(sum==MAX&&fin>node->value){
            fin=node->value;
        }
        return ;
    }
}
int main(){
    n=0;
    char t;
    while(scanf("%d%c",&mid[n++],&t)!=EOF){
          if(t=='\n');
          else
          while(scanf("%d%c",&mid[n++],&t)&&t!='\n');
          for(int i=0;i<n;i++)
            scanf("%d",&post[i]);
          Tree *root;/*定义根的节点*/
          root = BuildTree(mid,post,n);
          /*第一对数是中序遍历,第二对是后序遍历*/
          MAX = 200000000;
          fin = root -> value;
          dfs(root,root->value);
          printf("%d\n",fin);
          n=0;
          memset(mid,0,sizeof(mid));
          memset(post,0,sizeof(post));
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: