码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树求第三种遍历序列

时间:2017-08-13 01:17:56      阅读:330      评论:0      收藏:0      [点我收藏+]

标签:char*   data   strong   函数   ati   注意   turn   前序遍历   logs   

// 树的结点的结构:
struct TreeNode{
    TreeNode* LChild;
    TreeNode* RChild;
    char data;
};

注意: 求第三种序列必须有中序序列,比如前中求后 以及 中后求前,不可以前后求中

第一种情况:有前序序列和中序序列,求后序序列

前序: GDAFEMHZ  中序:ADEFGHMZ  需求得后序:AEFDHZMG

思路:利用递归解决.有一个函数

TreeNode* find_post_order(char* inOrder, char* preOrder, int length);

他的作用是: 在有一个中序和前序序列,以及这序列的长度(2者的长度当然一样)前提下,求后序序列

以所给的序列为例子:(前序: GDAFEMHZ  中序:ADEFGHMZ)

  • 由于是前序,故而G必然是树根
  • 以G分割中序序列知 ADEF G HMZ中,ADEF必为左子树序列,HMZ必为右子树序列
  • 递归对左子树进行求解,对右子树进行求解
  • :以G切割后:G  DAFEMHZ 中序 ADEF    HMZ
对于左子树,中序序列起始指针无需改变,靠length控制长度即可
但是左子树的前序序列需要 + 1,即去掉根结点
左子数的长度即是前序序列中根结点所在的index

对于右子树,中序序列的指针位置是原本的中序序列指针起始位置+rootIndex + 1,即上面的注中的H的位置
至于前序序列,因为前序遍历是 根->左->右, 所以右子树的前序序列是原本前序序列的指针位置 + 1 + rootIndex 即跃过了根,再跃过左子书的前序部分
至于长度,其实就是中序序列中, length - (rootIndex + 1), 其中rootIndex + 1代表包括根节点以前的部分的长度(即注中ADEFG部分的长度

当对左右子树都建立完,返回根节点指针即可
TreeNode* find_post_order(char* inOrder, char *preOrder, int length){
    if(length == 0) return NULL;

    int rootIndex;
    for(rootIndex = 0; rootIndex < length; ++rootIndex){
        if(inOrder[rootIndex] == *preOrder)
            break;
    }  // 求前序序列的第一个结点(即root结点)在中序序列中的坐标
    TreeNode *rootNode = new TreeNode;
    rootNode->data = *preOrder;

    //LEFT  SubTree 注意子树中序, 前序的起始地点以及起到控制作用的序列长度
    rootNode->LChild = find_post_order(inOrder, preOrder + 1, rootIndex);
    //RIGHT SubTree
    rootNode->RChild = find_post_order(inOrder + rootIndex + 1, preOrder + rootIndex + 1,length - (rootIndex + 1));
    cout<<rootNode->data <<" ";           //最终输出 root结点
    return rootNode;
}

 

同理推理,根据中序和后序求取前序序列

可以假设中序为 ADEFGHMZ 后序为 AEFDHZMG 需求得后序为 GDAFEMHZ

以后序的最后一个元素(即根)切割中序序列结果为

中序  ADEF  G  HMZ

后序  AEFDHZM  G

TreeNode* find_pre_order(char* inOrder, char* postOrder, int length){
    if(length == 0) return NULL;

    int rootIndex;
    for(rootIndex = 0; rootIndex < length; ++rootIndex){
        if(inOrder[rootIndex] == *(postOrder + length - 1))
            break;
    }

    TreeNode *rootNode = new TreeNode;
    rootNode->data = *(postOrder + length - 1);
    cout<<rootNode->data <<" ";
    rootNode->LChild = find_pre_order(inOrder, postOrder, rootIndex);
    rootNode->RChild = find_pre_order(inOrder + rootIndex + 1, postOrder + rootIndex, length - (rootIndex + 1));
    return rootNode;
}

 

二叉树求第三种遍历序列

标签:char*   data   strong   函数   ati   注意   turn   前序遍历   logs   

原文地址:http://www.cnblogs.com/Rosebud/p/7352137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!