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

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

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

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客楼主
    发贴心情 [原创]已知先序中序序列确定二叉树的算法

    最近复习都忙不赢上论坛了,前天看二叉树的时候写了个知先序中序序列确定二叉树的算法,现在贴出来供大家参考。:)

    算法:(类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里的不分改成递归调用就行。


       收藏   分享  
    顶(0)
      




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

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

     *树形目录 (最近20个回帖) 顶端 
    主题:  [原创]已知先序中序序列确定二叉树的算法(2942字) - binaryluo,2005年12月10日
        回复:  你给的第一种算法运行不了啊...(32字) - suiyufei110,2007年1月18日
            回复:  [quote][b]以下是引用[i]suiyufei110在2007-1-18 13:27:00[..(178字) - binaryluo,2007年1月18日
        回复:  不明白,怎么可能是O(lnN)?每个节点都要访问一次,所以至少是O(N)实际上是它的一个确切界..(93字) - bigc,2006年12月23日
        回复:  好文章啊,就是不知道问什么到了叶子哪里就不添加到树里了else { ..(229字) - jgh37,2006年12月20日
            回复:  [quote][b]以下是引用[i]jgh37在2006-12-20 11:18:00[/i]的发..(690字) - binaryluo,2006年12月22日
        回复:  受打击啊(8字) - 波多黎西橘子15,2006年6月4日
        回复:  ......you don't quite catch me...(34字) - phoenixinter,2006年5月18日
            回复:  [quote][b]以下是引用[i]phoenixinter在2006-5-18 19:18:00..(124字) - binaryluo,2006年5月19日
                回复:  我的意思是,如果这棵树的每个顶点是标号的那么直接hash一下就可以每次找出根了..(76字) - phoenixinter,2006年5月19日
        回复:  label means we can hash to find the pivot.....(44字) - phoenixinter,2006年5月18日
            回复:  [quote][b]以下是引用[i]phoenixinter在2006-5-18 11:25:00..(155字) - binaryluo,2006年5月18日
        回复:  if the nodes of the binary trees are labeled in b..(119字) - phoenixinter,2006年5月18日
            回复:  [quote][b]以下是引用[i]phoenixinter在2006-5-18 6:56:00[..(268字) - binaryluo,2006年5月18日
        回复:  谢谢哦(6字) - xiaoyaochenyan,2006年5月16日
        回复:  怎么用程序编写(14字) - yangjie123,2006年5月16日
            回复:  [quote][b]以下是引用[i]yangjie123在2006-5-16 16:03:00[/..(184字) - binaryluo,2006年5月17日
        回复:  呵呵辛苦了你能不能给个递规的啦谢谢先(38字) - yangyifeng,2006年5月11日
        回复:  我真菜。。。什么都看不懂。。。这大学白读了。。。(52字) - 无聊居士,2006年2月15日
        回复:  [注意]错误更正!!(6304字) - binaryluo,2006年1月5日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    109.375ms