新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> We choose to study algorithmic problems,  not because they are easy,  but because they are hard.
    [返回] 计算机科学论坛计算机理论与工程『 算法理论与分析 』 → [原创]已知先序中序序列确定二叉树的算法 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 58967 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [原创]已知先序中序序列确定二叉树的算法 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客11
    发贴心情 [注意]错误更正!!

    上述的算法在构建时候有问题,现已更正如下:

    算法1:(类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].data);   // 在order中找到根节点所在的位置
              visited[ p ] = TRUE;                         // 标识order中的根元素已被访问过
              cur = T;                                    // cur表示当前构建的节点

              for (i = 1; i < pre.length; ) {
                   
                    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;
                            p = LocateElem(order, pre[ i ++].data); // 定位pre[ i ]的位置
                            visited[ p ] = TRUE;
                            Push(Stack, cur);        // 当前节点进栈
                            cur = cur->lchild;        // 当前节点指向左孩子
                    }
                    else if (p < order.length && !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;
                            p = LocateElem(order, pre[ i ++].data); // 定位pre[ i ]的位置
                            visited[ p ] = TRUE;
                            cur = cur->rchild;
                    }
                    else {
                            Pop(Stack, cur);        // 左右都没有子树即是叶子,则退栈
                            p = LocateElem(order, cur.data); // 重新定位p的位置
                    }
              }
    }

    算法2:(红色的部分是在原算法上改进的地方)
    #define   FALSE    0
    #define   TRUE     1
    typedef int Status;

    typedef struct {
           BiTNode node;  // 原来中序中的节点
           int index;           // 新加的索引字段
    }IndexNode, IndexList;

    Status IndexSort(BiTNode order[], IndexList idx){
           for (i = 0; i < order.length; i ++){  // 构建一个索引表
                 idx[ i ].node = order[ i ];
                 idx[ i ].index = i;
           }

           QSort(idx, 0, L.length);  // 快速排序,需在清华数据结构274-275页算法的基础上稍加改变

           return OK;
    }


    Status createTree(BiTree &T, BiTNode pre[], BiTNode order[]){
              // 已知先序序列pre和中序序列order,构建一个二叉树T的非递归实现。
              // 其中涉及到的数据结构请参看清华大学《数据结构》(C语言版)
                
              IndexList *idx;            
              IndexSort(order, idx);  // 对order索引排序
              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 = idx[ pre[ 0 ].data - idx[ 0 ].data].index   // 在order中找到根节点所在的位置
              visited[ p ] = TRUE;                         // 标识order中的根元素已被访问过
              cur = T;                                    // cur表示当前构建的节点

              for (i = 1; i < pre.length; ) {
                   
                    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;
                            p = idx[pre[ i  ++].data - idx[ 0 ].data].index; // 用索引在order中定位
                            visited[ p ] = TRUE;
                            Push(Stack, cur);        // 当前节点进栈
                            cur = cur->lchild;        // 当前节点指向左孩子
                    }
                    else if (p < order.length && !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;
                            p = idx[pre[ i  ++].data - idx[ 0 ].data].index; // 用索引在order中定位
                            visited[ p ] = TRUE;
                            cur = cur->rchild;
                    }
                    else {
                            Pop(Stack, cur);        // 左右都没有子树即是叶子,则退栈
                            p = idx[cur.data - idx[ 0 ].data].index; // 用索引在order中定位
                    }
              }
    }

    实在不好意思了,原来写完以后一高兴就忘记检查了,今天才发现错误。
    敬请原谅。


    [此贴子已经被作者于2006-1-6 12:26:14编辑过]
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/5 22:15:00
     
     无聊居士 帅哥哟,离线,有人找我吗?魔羯座1987-1-1
      
      
      等级:大一新生
      文章:10
      积分:87
      门派:XML.ORG.CN
      注册:2006/2/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给无聊居士发送一个短消息 把无聊居士加入好友 查看无聊居士的个人资料 搜索无聊居士在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看无聊居士的博客12
    发贴心情 
    我真菜。。。
    什么都看不懂。。。
    这大学白读了。。。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/15 22:44:00
     
     yangyifeng 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:56
      门派:XML.ORG.CN
      注册:2006/5/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给yangyifeng发送一个短消息 把yangyifeng加入好友 查看yangyifeng的个人资料 搜索yangyifeng在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看yangyifeng的博客13
    发贴心情 
    呵呵辛苦了你
    能不能给个递规的啦谢谢先
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/11 21:22:00
     
     yangjie123 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2006/5/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给yangjie123发送一个短消息 把yangjie123加入好友 查看yangjie123的个人资料 搜索yangjie123在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看yangjie123的博客14
    发贴心情 
    怎么用程序编写
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/16 16:03:00
     
     xiaoyaochenyan 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2006/5/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给xiaoyaochenyan发送一个短消息 把xiaoyaochenyan加入好友 查看xiaoyaochenyan的个人资料 搜索xiaoyaochenyan在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看xiaoyaochenyan的博客15
    发贴心情 
    谢谢哦
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/16 16:44:00
     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客16
    发贴心情 
    以下是引用yangjie123在2006-5-16 16:03:00的发言:
    怎么用程序编写

    这个用类C语言描述的算法已经很接近程序了,只需要加上变量声明等一些语法规则就可以了啊。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/17 14:40:00
     
     phoenixinter 帅哥哟,离线,有人找我吗?水瓶座1987-2-12
      
      
      威望:1
      头衔:Ikki
      等级:大四(GRE考了1600分!)(版主)
      文章:127
      积分:1126
      门派:Lilybbs.net
      注册:2005/3/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给phoenixinter发送一个短消息 把phoenixinter加入好友 查看phoenixinter的个人资料 搜索phoenixinter在『 算法理论与分析 』的所有贴子 点击这里发送电邮给phoenixinter  引用回复这个贴子 回复这个贴子 查看phoenixinter的博客17
    发贴心情 
    if the nodes of the binary trees are labeled in both preorder and inorder...then a slight modification can made it O(n)

    ----------------------------------------------
    phoenixinter
    algorithm bm@lilybbs
    ikki@poj

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/18 6:56:00
     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客18
    发贴心情 
    以下是引用phoenixinter在2006-5-18 6:56:00的发言:
    if the nodes of the binary trees are labeled in both preorder and inorder...then a slight modification can made it O(n)

    你说的加标签有什么意义呢?如果是为了排序的话最好就是O(nlgn)了。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/18 11:17:00
     
     phoenixinter 帅哥哟,离线,有人找我吗?水瓶座1987-2-12
      
      
      威望:1
      头衔:Ikki
      等级:大四(GRE考了1600分!)(版主)
      文章:127
      积分:1126
      门派:Lilybbs.net
      注册:2005/3/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给phoenixinter发送一个短消息 把phoenixinter加入好友 查看phoenixinter的个人资料 搜索phoenixinter在『 算法理论与分析 』的所有贴子 点击这里发送电邮给phoenixinter  引用回复这个贴子 回复这个贴子 查看phoenixinter的博客19
    发贴心情 
    label means we can hash to find the pivot...

    ----------------------------------------------
    phoenixinter
    algorithm bm@lilybbs
    ikki@poj

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/18 11:25:00
     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客20
    发贴心情 
    以下是引用phoenixinter在2006-5-18 11:25:00的发言:
    label means we can hash to find the pivot...

    这个hash函数不好构造……

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/18 13:52:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 算法理论与分析 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/8 22:36:19

    本主题贴数28,分页: [1] [2] [3]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    156.250ms