| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1583 人关注过本帖
标题:一道关于二叉树的题
只看楼主 加入收藏
qiqiea
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-9-21
收藏
 问题点数:0 回复次数:7 
一道关于二叉树的题
已知一棵二叉树的先序遍历序列和中序遍历序列,编写一个程序唯一确定一棵二叉树(完整版)
搜索更多相关主题的帖子: 二叉树 遍历 序列 和中 
2007-09-23 09:36
qiqiea
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-9-21
收藏
得分:0 
请各位高手速度了,我在这先谢谢了!  另祝各位中秋快乐!!!!!!
2007-09-23 09:40
qiqiea
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-9-21
收藏
得分:0 
2007-09-23 09:41
prodream
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-9-16
收藏
得分:0 

我简单说下思想:
用前序序识别根,用中序序列区分左右树.具体构造方法是:从前序遍历序列中找出第一个结点,其必为待构造的二叉树的根,然后在中序遍历序列中查找该结点,则它(中序序列中)的左边为左子树结点(左边无结点时,左子数为空),右边为右子树结点(右边无结点时,右子树为空),这样,可在前序遍历序列中找出左子树结点与右结点的分界点.因此,在前序与中序遍历序列中就找到了根的左子树结点序列与右子树结点序列,从而,可用相同的方法再处理左子树结点序列与右子树序列.左右子树处理完后,整个二叉树也就确定了.


欢迎加入c语言交流群(27214501),数据结构与算法(27214930)(限非新手进)博客://prodream.blog./
2007-09-23 21:15
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
程序俺很早前写过一个,好像代码挺长的,现在找不着了。。。

努力成为菜鸟!
2007-09-24 08:43
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
到我二叉树帖子中找吧.

倚天照海花无数,流水高山心自知。
2007-09-25 15:58
qxyaizzc
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-11-21
收藏
得分:0 
#include "stdio.h"
#include "stdlib.h"

#define ERROR 0
#define OK 1


typedef char TElemType;
typedef int Status;

typedef struct BinaryTree

{
  TElemType data;         /*结点数据域*/
  struct BinaryTree *lchild;   /*左孩子指针 */

  struct BinaryTree *rchild;  /*右孩子指针*/
}*BiTree,BiNode;

Status CreateBiTree(BiTree *T)
{ /* 按先序次序输入二叉树中结点值(一个字符),’#’字符表示空树。构造二叉链表表示的二叉树 T*/


 char  ch;

scanf ("%c",&ch );   /* 输入字符*/

  if(ch=='#')          /* 若是#字符,则令指针为空*/
  (*T)=NULL;

else {

if ( ! ( (*T) = ( BiNode * ) malloc ( sizeof ( BiNode ) ) ) )
return ERROR;

(*T)->data=ch;   /* 生成根结点*/


CreateBiTree ((& (*T)->lchild) );     /*构造左子树*/


CreateBiTree ((&(* T)->rchild ));   /*构造右子树 */


}

return OK;



}

Status printelem(TElemType d)
{
  printf("%c\t",d);
  return OK;
}

Status PreOrderTraverse(BiTree T,Status (*Visit)(TElemType d))
{  if(T) {
            if(Visit(T->data))                      /*访问根结点*/
                if(PreOrderTraverse(T->lchild,Visit))       /*遍历左子树*/
            if(PreOrderTraverse(T->rchild,Visit))  /*遍历右子树*/
               return OK;
             return ERROR;
        }  else
               return OK;


}

Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType d))
{  if(T) {
            if(InOrderTraverse(T->lchild,Visit))            /*遍历左子树*/
                if(Visit(T->data))                              /*访问根结点*/
            if(InOrderTraverse(T->rchild,Visit) )   /*遍历右子树*/
               return OK;
             return ERROR;
        }  else
               return OK;


}

Status PostOrderTraverse(BiTree T,Status (*Visit)(TElemType d))
{  if(T) {
            if(PostOrderTraverse(T->lchild,Visit))        /*遍历左子树*/
                if(PostOrderTraverse(T->rchild,Visit))      /*遍历右子树*/
                        if(Visit(T->data))                      /*访问根结点*/
               return OK;
             return ERROR;
        }  else
               return OK;


}
void main()
{
  BiTree root;



  printf("er cha shu de sheng cheng he bian li .c\n");

  printf("=======================================\n\n\n\n\n");

  printf("qing shu ru zi fu:\n\n");

  CreateBiTree(&root);


  printf("\nxian xu bian li :\n");
  PreOrderTraverse(root,printelem);

  printf("\nzhong xu bian li :\n");
  InOrderTraverse(root,printelem);

  printf("\nhou xu bian li :\n");
  PostOrderTraverse(root,printelem);

  getch();

}

2007-11-22 19:37
qxyaizzc
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-11-21
收藏
得分:0 
这是我刚刚做的啊
是正确的啊我是国了啊
2007-11-22 19:38
快速回复:一道关于二叉树的题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021278 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved