• 根据二叉树先序和中序顺序写出后序顺序(递归)


    这是一个经常遇到的问题,今天再次遇到了,重新把它写一下。

    (该图来自http://baike.baidu.com/view/1898358.htm)

    如上图所示为一棵二叉树,其三种遍历的顺序依次为:

    先序遍历:ABDECF

    中序遍历:DBEAFC

    求后序遍历。

    思路:根据先序遍历,可以确立A为其根节点,中序遍历的序列中A左边的为其左子树,右边为其右子树,可以根据这一思路来进行二叉树的构建

    关键点:左子树在中序遍历中为DBE在先序遍历中为BDE,即长度相等

    可以结合字符串处理等相关的函数不难写出程序。

    二叉树的数据结构:

     1 typedef char ElementType;
     2 struct NodeType;
     3 typedef struct NodeType * TreePoint;
     4 
     5 struct NodeType
     6 {
     7     ElementType nodeid;
     8     TreePoint leftnode;
     9     TreePoint rightnode;
    10 };

    处理函数:

     1 void premidBuildtree(char* pre, char * mid, TreePoint root)
     2 {
     3     int len = strlen(pre);
     4 
     5     if(len == 0)
     6     {
     7         return;
     8     }
     9 
    10     char *p = strchr(mid,pre[0]);
    11     int pos = (int)(p-mid+1);
    12     root->nodeid = pre[0];
    13     if(pos != 1)
    14     {
    15         TreePoint childleft = new NodeType;
    16         root->leftnode = childleft;
    17         childleft->nodeid = pre[1];
    18         childleft->leftnode = NULL;
    19         childleft->rightnode = NULL;
    20         char * leftprechar = new char[pos];
    21         char * leftmidchar = new char[pos];
    22         strncpy(leftprechar,pre+1,pos-1);
    23         leftprechar[pos-1]='';
    24         strncpy(leftmidchar,mid,pos-1);
    25         leftmidchar[pos-1]='';
    26         premidBuildtree(leftprechar,leftmidchar,childleft);
    27     }
    28 
    29     if(pos != len)
    30     {
    31         TreePoint childright = new NodeType;
    32         root->rightnode = childright;
    33         childright->nodeid = pre[pos];
    34         childright->leftnode = NULL;
    35         childright->rightnode = NULL;
    36         char * rightprechar = new char[len - pos +1];
    37         char * rightmidchar = new char[len - pos +1];
    38         strncpy(rightprechar,pre+pos,len-pos);
    39         rightprechar[len - pos] = '';
    40         strncpy(rightmidchar,mid+pos,len-pos);
    41         rightmidchar[len - pos] = '';
    42         premidBuildtree(rightprechar,rightmidchar,childright);
    43         
    44     }
    45 
    46 }

    这个代码的实现,参考了http://www.cnblogs.com/zhangchaoyang/articles/2008434.html这篇文章,在这里,谢谢作者提供的清晰的思路和详细的注释!

    我实现的过程主要遇到的问题:

    • strncpy()函数,并不会在拷贝结束的字符串后面默认添加‘’,这个过程需要自己来做,否则在vs2010当中编译会产生问题,该函数的描述请见:http://www.cplusplus.com/reference/cstring/strncpy/
    • strlen()函数取得的C风格字符串的长度值不包含最后''的长度
    • 该版本是实现的递归算法,该问题有非递归算法,随后整理
  • 相关阅读:
    iBatis,第二次亲密接触
    微斯人,吾谁与归
    一个月了
    生命在于运动
    眼皮跳了好几天
    往返
    中病毒,学习批处理

    爱如潮水
    今天夏至
  • 原文地址:https://www.cnblogs.com/bugking/p/3655200.html
Copyright © 2020-2023  润新知