/* problem:tree
coder:commence
data:2014.2.24
result:unknown
general idea:已知二叉树的中序后序,求二叉树最短路径的长度,输出这条路径上的所有值,如果最小路径的长度有多条,输出最小路径中值最小的那棵树的值
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXN 10000
typedef struct node
{
int val;
struct node *left;
struct node *right;
}Node;
int getans[MAXN];
int record[MAXN][MAXN];
int post[MAXN],in[MAXN];
int accel;
void intcpy(int *tag,int *src,int len)
{
int i;
for (i=0;i<len;i++)
tag[i]=src[i];
}
void debtree(Node*root)
{
if (root!=NULL)
{
debtree(root->left);
debtree(root->right);
free(root);
}
}
int getindex(int tag[],int src,int len)
{
int i;
for (i=0;i<=len;i++)
if (tag[i]==src) return i;
return -1;//-1代表没有对应元素
}
Node *buildtree(int inorder[],int postorder[],int len,int *issuccess)
{
if (len<=0 || issuccess==0) return NULL;
int index=getindex(inorder,postorder[len-1],len);
if (index<0)
{
*issuccess=0;
fprintf(stderr,"error no correspond item");
return NULL;
}
Node* root=(Node*)malloc(sizeof(Node));
if (!root)
{
*issuccess=0;
fprintf(stderr,"out of memory");
return NULL;
}
root->val=postorder[len-1];
int leftlength=index;
int rightlength=len-1-index;
root->left=buildtree(inorder,postorder,leftlength,issuccess);
root->right=buildtree(inorder+leftlength+1,postorder+leftlength,rightlength,issuccess);
return root;
}
void dfs(Node *root,int (*re)[MAXN],int *cur1,int cur2)//这里这么调用把,dfs(root,record,&a,0) 另外有赋值int a=0;还是没有空腹树根的问题
{
if (root!=NULL)
{
re[*cur1][cur2]=root->val;
printf("--%d#%d*%d\n",root->val,*cur1,cur2);
}
if (root->left==NULL && root->right==NULL)
{
accel=1;
return ;
}
if (root->left!=NULL)
dfs(root->left,re,cur1,cur2+1);
if (accel) {(*cur1)++; intcpy(re[*cur1],re[(*cur1)-1],cur2+1);}
if (root->right!=NULL)
dfs(root->right,re,cur1,cur2+1);
} //第一次写DFS写错了,开始重写,建树DFS结束,销毁,初始化,设定再主函数进行
void show(int (*re)[MAXN])
{
int i,j;
for (i=0;re[i][0]!=-1;i++)
{for (j=0;re[i][j]!=-1;j++)
printf("%d ",re[i][j]);
putchar('\n');
}
}
void showtree(Node *root)
{
if (root->left!=NULL)
showtree(root->left);
if (root!=NULL)
printf("%d ",root->val);
if (root->right!=NULL)
showtree(root->right);
}
int main()
{
int flag=0,j;//min依存于minroad注意这里有一个关系,这里处理输入
while (1)
{ int n=0,i,issuccess=0,cur1=0,min=10000,minroad=10000,k;
char ch;
for (n=0;scanf("%d%c",&in[n++],&ch);)
{
if (ch=='\n')
{
for (i=0;i<n;i++)
scanf("%d",&post[i]);
break;
}
}
memset(record,-1,sizeof(record));
memset(getans,0,sizeof(getans));//记录相同路经长的路径
Node *root;
root=buildtree(in,post,n,&issuccess);
showtree(root);
putchar('\n');
dfs(root,record,&cur1,0);
show(record);
debtree(root);
for (i=0;record[i][0]!=-1;i++)
for (j=0;record[i][j]!=-1;j++)
getans[i]=j;
for (j=0;j<i;j++)
if (getans[j]<minroad) {minroad=getans[j];k=j;}
for (j=0;j<i;j++)
{ if (j==k) continue;
if (getans[j]==minroad) {flag=1;break;}
}
if (flag)
{
for (j=0;j<i;j++)
if (getans[j]==minroad)
{ int k;
for (k=0;record[j][k]!=-1;k++)
if (record[j][k]<min) min=record[j][k];
}
}
if (flag)printf("minans=%d\n",min);
else printf("minroadans=%d",minroad);
}
return 0;
}
// 存树DFS,成功yeah,
coder:commence
data:2014.2.24
result:unknown
general idea:已知二叉树的中序后序,求二叉树最短路径的长度,输出这条路径上的所有值,如果最小路径的长度有多条,输出最小路径中值最小的那棵树的值
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXN 10000
typedef struct node
{
int val;
struct node *left;
struct node *right;
}Node;
int getans[MAXN];
int record[MAXN][MAXN];
int post[MAXN],in[MAXN];
int accel;
void intcpy(int *tag,int *src,int len)
{
int i;
for (i=0;i<len;i++)
tag[i]=src[i];
}
void debtree(Node*root)
{
if (root!=NULL)
{
debtree(root->left);
debtree(root->right);
free(root);
}
}
int getindex(int tag[],int src,int len)
{
int i;
for (i=0;i<=len;i++)
if (tag[i]==src) return i;
return -1;//-1代表没有对应元素
}
Node *buildtree(int inorder[],int postorder[],int len,int *issuccess)
{
if (len<=0 || issuccess==0) return NULL;
int index=getindex(inorder,postorder[len-1],len);
if (index<0)
{
*issuccess=0;
fprintf(stderr,"error no correspond item");
return NULL;
}
Node* root=(Node*)malloc(sizeof(Node));
if (!root)
{
*issuccess=0;
fprintf(stderr,"out of memory");
return NULL;
}
root->val=postorder[len-1];
int leftlength=index;
int rightlength=len-1-index;
root->left=buildtree(inorder,postorder,leftlength,issuccess);
root->right=buildtree(inorder+leftlength+1,postorder+leftlength,rightlength,issuccess);
return root;
}
void dfs(Node *root,int (*re)[MAXN],int *cur1,int cur2)//这里这么调用把,dfs(root,record,&a,0) 另外有赋值int a=0;还是没有空腹树根的问题
{
if (root!=NULL)
{
re[*cur1][cur2]=root->val;
printf("--%d#%d*%d\n",root->val,*cur1,cur2);
}
if (root->left==NULL && root->right==NULL)
{
accel=1;
return ;
}
if (root->left!=NULL)
dfs(root->left,re,cur1,cur2+1);
if (accel) {(*cur1)++; intcpy(re[*cur1],re[(*cur1)-1],cur2+1);}
if (root->right!=NULL)
dfs(root->right,re,cur1,cur2+1);
} //第一次写DFS写错了,开始重写,建树DFS结束,销毁,初始化,设定再主函数进行
void show(int (*re)[MAXN])
{
int i,j;
for (i=0;re[i][0]!=-1;i++)
{for (j=0;re[i][j]!=-1;j++)
printf("%d ",re[i][j]);
putchar('\n');
}
}
void showtree(Node *root)
{
if (root->left!=NULL)
showtree(root->left);
if (root!=NULL)
printf("%d ",root->val);
if (root->right!=NULL)
showtree(root->right);
}
int main()
{
int flag=0,j;//min依存于minroad注意这里有一个关系,这里处理输入
while (1)
{ int n=0,i,issuccess=0,cur1=0,min=10000,minroad=10000,k;
char ch;
for (n=0;scanf("%d%c",&in[n++],&ch);)
{
if (ch=='\n')
{
for (i=0;i<n;i++)
scanf("%d",&post[i]);
break;
}
}
memset(record,-1,sizeof(record));
memset(getans,0,sizeof(getans));//记录相同路经长的路径
Node *root;
root=buildtree(in,post,n,&issuccess);
showtree(root);
putchar('\n');
dfs(root,record,&cur1,0);
show(record);
debtree(root);
for (i=0;record[i][0]!=-1;i++)
for (j=0;record[i][j]!=-1;j++)
getans[i]=j;
for (j=0;j<i;j++)
if (getans[j]<minroad) {minroad=getans[j];k=j;}
for (j=0;j<i;j++)
{ if (j==k) continue;
if (getans[j]==minroad) {flag=1;break;}
}
if (flag)
{
for (j=0;j<i;j++)
if (getans[j]==minroad)
{ int k;
for (k=0;record[j][k]!=-1;k++)
if (record[j][k]<min) min=record[j][k];
}
}
if (flag)printf("minans=%d\n",min);
else printf("minroadans=%d",minroad);
}
return 0;
}
// 存树DFS,成功yeah,