24小时热门版块排行榜    

查看: 250  |  回复: 0
当前主题已经存档。

zsglly

木虫 (著名写手)

[交流] [原创]已知先序中序序列确定二叉树的算法

前天看二叉树的时候写了个知先序中序序列确定二叉树的算法,现在贴出来供大家参考。:)

算法:(类C语言描述)
#define   FALSE    0
#define   TRUE     1
typedef int Status;

Status createTree(BiTree &T, BiTNode pre[], BiTNode order[]){
          // 已知先序序列pre和中序序列order,构建一个二叉树T的非递归实现。
          // 其中涉及到的数据结构请参看清华大学《数据结构》(C语言版)

          InitStack(Stack);        //初始化栈
          for (i = 0; i < order.length; i ++) visited[ i ] = FALSE;
                                            // 初始化visited,visited用于标记order
                                            // 中的元素是否已经被访问过
          T = (BiTree *) malloc (sizeof(BiTree));
          T.data = pre[0]; T -> lchild = NULL; T -> rchild = NULL;
                                           // 生成根节点,先序pre中的第一个元素肯定是树根,
                                           // 左右孩子初始化为NULL。
          p = LocateElem(order, pre[0]);   // 在order中找到根节点所在的位置
          visited[ p ] = TRUE;                         // 标识order中的根元素已被访问过
          cur = root;                                    // cur表示当前构建的节点

          for (i = 1; i < pre.length; ) {
                p = LocateElem(order, pre[ i ]); // 定位pre[ i ]的位置
                if (p > 0 && !visited[p - 1]) {
                        // 在order中pre[ i ]的左边有元素并且未被访问过,说明有左子树存在,
                        // 生成左子树
                        cur->lchild = (BiTNode *) malloc (sizeof(BiTNode));
                        cur->lchild.data = pre[i ++];
                                        // 将当前pre中的元素赋给lchild后指向下一个元素
                        cur->lchild->lchild = NULL; cur->rchild->rchild= NULL;
                        visited[ p ] = TRUE;
                        Push(Stack, cur);        // 当前节点进栈
                        cur = cur->lchild;        // 当前节点指向左孩子
                }
                else if (p < order.length - 1 && !visited[p + 1]) {
                        // 生成右子树
                        cur->lchild = NULL;   // 没有左孩子
                        cur->rchild = (BiTNode *) malloc (sizeof(BiTNode));
                        cur->rchild.data = pre[i ++];
                        cur->rchild.lchild = NULL; cur->rchlid.rchild = NULL;
                        visited[ p ] = TRUE;
                        cur = cur->rchild;
                }
                else {
                        Pop(Stack, cur);        // 左右都没有子树即是叶子,则退栈
                }
          }
}

算法分析:
假设有n个节点,在初始化visited时(第一个for循环)赋值次数等于order的长度n,生成左右子树时(第二个for循环)外层循环为n-1次,其中定位pre[ i ]时最坏比较n次,所以基本操作次数是n+n*(n-1),时间复杂度为O(n方)。
根据这个非递归要写出递归实现很简单,只需将if-else里的不分改成递归调用就行。

[ Last edited by 幻影无痕 on 2006-11-25 at 07:33 ]
回复此楼

» 猜你喜欢

做人要厚道啊!厚道啊!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zsglly 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 29号明天会评吗 +4 笨笨唐 2026-08-28 4/200 2026-08-31 09:30 by huixian257
[基金申请] 基金不中,共勉 +12 eulota 2026-08-26 12/600 2026-08-31 08:42 by ZJTJZ
[基金申请] 投票:  有多少人是今天查系统知道结果的? +17 爱看书的可乐 2026-08-26 19/950 2026-08-31 08:28 by xiangy672
[基金申请] 面上意见出来了 +10 黄鸟于飞Chao 2026-08-29 19/950 2026-08-31 08:01 by blueearth171
[基金申请] 为什么到现在没收到通知? +5 tannykie 2026-08-29 5/250 2026-08-30 21:05 by purplejack
[基金申请] 麻烦专家们看看评委们的意见(F口面上) +6 gdd2018 2026-08-28 11/550 2026-08-30 08:58 by 超级无敌华子
[基金申请] 我就是申请一个面上项目而已,这评审意见是按照杰青的条件评的吧? +6 gouxfjh 2026-08-28 11/550 2026-08-30 07:57 by gouxfjh
[基金申请] 国自然评审意见 +13 wangmingqi 2026-08-28 19/950 2026-08-29 10:22 by Poppy1104
[基金申请] 哪位高人中了,把查询到的截图贴出来让我看看,让我长长见识 +5 yuleib84 2026-08-26 6/300 2026-08-28 00:02 by yudaoqian88
[基金申请] 面上合作单位盖章 +5 ssyjh 2026-08-27 5/250 2026-08-27 20:50 by gdfollow
[基金申请] 看板上这么多中的,有点像50人群里49个人都是骗子的那种感觉…… +5 a089 2026-08-26 6/300 2026-08-27 14:05 by jonewore
[基金申请] 怎么看青基中了没有啊 +5 叶九微 2026-08-26 5/250 2026-08-27 10:35 by l_zh2008
[基金申请] 为什么 国际(地区)合作与交流项目 没有放榜? 10+3 majunge000 2026-08-26 11/550 2026-08-27 08:42 by 北京莱茵编辑
[基金申请] 我不理解! +15 Edward_pc 2026-08-26 23/1150 2026-08-26 20:34 by zzuzxg
[基金申请] 出来了 +9 trojank 2026-08-26 9/450 2026-08-26 14:25 by 宝贝虫子
[基金申请] 为什么国自然不能直接公布 +4 bjdxyxy 2026-08-26 4/200 2026-08-26 13:12 by qingmu1201
[基金申请] 国际合作可查了,中了面上 (EPI+1)(金币+50) +18 Ldrop2023 2026-08-26 18/900 2026-08-26 11:15 by cmrandy
[基金申请] 系统进不去 +4 yanglien 2026-08-26 5/250 2026-08-26 11:10 by wenfengw83
[基金申请] 牛来!米来!面来! +8 beefly 2026-08-26 8/400 2026-08-26 08:37 by xuzhipiao
[基金申请] 没有任何消息-是不是就凉了 +9 图啦图啦 2026-08-24 10/500 2026-08-25 11:59 by 南海小哥
信息提示
请填处理意见