回 帖 发 新 帖 刷新版面

主题:[原创]根据后序 前序建立二叉树

根据前序 后序序列建立的二叉树形态不唯一(单枝节点的左孩子 右孩子不好区分,这里作为左孩子)。
说明:首先根据两个序列,构建建立二叉树需要的输入序列。然后使用队列建树。


# include <stdio.h>
# include <stdlib.h>
# define M 50
# define N 30
typedef struct Tn
{
  int data;
  struct Tn *left;
  struct Tn *right;
}TNode,*TLink;



int SearchV(int  *a,int data)
{
    int i;
    for(i=0;data!=a[i];i++);
    return i;
}


void PrintBtree(TLink root)
{
    if(root!=NULL)
    {
        PrintBtree(root->left);
        PrintBtree(root->right);
        printf("%3d",root->data);
        
    }
}


TLink CreateBtree(int InC[])
{
      TLink root,Temp;
      int Front=-1,Rear=-1;
      int i=1;
      TLink Que[30];
      root=(TLink)malloc(sizeof(TNode));
      root->data=InC[0];
      Rear++;
      Que[Rear]=root;
      while(Front<Rear)
      {
          Front++;
          Temp=Que[Front];
          if(InC[i]!=0)
          {
             
              Temp->left=(TLink)malloc(sizeof(TNode));
              Temp->left->data=InC[i];
              Rear++;
              Que[Rear]=Temp->left;
          }
          else
           Temp->left=NULL;
          i++;
          if(InC[i]!=0)
          {
             Temp->right=(TLink)malloc(sizeof(TNode));
             Temp->right->data=InC[i];
             Rear++;
             Que[Rear]=Temp->right;
          }
          else
             Temp->right=NULL;
         i++;
      }
      return root;
}    
                   

int main()
{
    int Pre[]={8,5,1,3,2,4,6,7,10,9,11};
    int Post[]={2,4,3,1,7,6,5,9,11,10,8};
    int In_C[M],data;
    int k=0,i=0,j;
    int m,n,Ld,Rd;
    TLink root;
    In_C[0]=Pre[0];
    while(k<=i)      //以下为构建建立二叉树需要的输入序列
    {
        data=In_C[k];
        if(data!=0)
        {
            m=SearchV(Pre,data);
            n=SearchV(Post,data);
            if(m+1>10)
                Ld=0;
            else
                Ld=Pre[m+1];
            for(j=i;j>=0;j--)
            {
                if(Pre[m+1]==In_C[j])
                {
                    Ld=0;
                    break;
                }
            }
            i++;
            In_C[i]=Ld;
            if(n-1<0)
                Rd=0;
            else
                Rd=Post[n-1];
            for(j=i;j>=0;j--)
            {
                if(Post[n-1]==In_C[j])
                {
                    Rd=0;
                    break;
                }
            }
            i++;
            In_C[i]=Rd;
        }
        k++;
    }
    printf("\n");
    root=CreateBtree(In_C);
    PrintBtree(root);
    return 1;
}
 


寒假里(1月25号以后)我想写些小游戏(希望写过的前辈能帮一下忙。感兴趣的大家一起写。我的邮箱:chch_1@sina.com)

回复列表 (共6个回复)

沙发

[quote]根据前序 后序序列建立的二叉树形态不唯一[/quote]

If you have both 前序 后序, the tree is unique.

板凳


单枝接点构造不唯一吧.它的孩子即可以是左孩子也可以是右孩子吧???

3 楼

[quote]
单枝接点构造唯一不吧.它的孩子即可以是左孩子也可以是右孩子吧???[/quote]

Yes, I found some ambiguous cases now. However, it is not what you said.

AB in pre_order, BA in post_order, we can get two different conclusions. 
1) A = left_child, B = root
2) A = root, B = right_child

I never thought about this, now I have learned something new. [em2]

Thanks, LZ!

4 楼

我的就是那意思.

如果只会SDK(vc)编程,现在容易找工作吗??不会MFC.

5 楼

even original binary tree: A = root, L = left_child, R = right_child

Pre_order LAR
Post_order RAL

can produce different trees. Try it! L or R can be root too.

Therefore, Pre_order and Post_order cannot reproduce the binary tree back should be correct answer!!!!

I was wrong!

6 楼

[quote]
如果只会SDK(vc)编程,现在容易找工作吗??不会MFC.[/quote]

I have no idea. I am in a totally different job market. Sorry!

我来回复

您尚未登录,请登录后再回复。点此登录或注册