zoukankan      html  css  js  c++  java
  • 根据二叉树的前序和中序求后序

    转自:http://blog.csdn.net/hinyunsin/article/details/6315502

    在面试的过程中,发现有几家公司都喜欢考这样的一道题,就是在一棵二叉树中,已知这棵二叉树的前序和中序遍历结果,要求写出后序遍历结果。

    例如:在一棵二叉树总,前序遍历结果为:ABDGCEFH,中序遍历结果为:DGBAECHF,求后序遍历结果。

    我们知道:

    前序遍历方式为:根节点->左子树->右子树

    中序遍历方式为:左子树->根节点->右子树

    后序遍历方式为:左子树->右子树->根节点

    从这里可以看出,前序遍历的第一个值就是根节点,然后再中序遍历中找到这个值,那么这个值的左边部分即为当前二叉树的左子树部分前序遍历结果,这个值的右边部分即为当前二叉树的右子树部分前序遍历结果。因此,通过这个分析,可以恢复这棵二叉树,得到这样的一段伪码:

     

    节点 getRoot(前序,中序)

    c=前序第一个字符

    pos=c在中序中的位置

    len1=中序pos左半部分长度

    len2=中序pos右半部分长度

    新建节点r,令r的元素等于c

    r的左儿子=getRoot(前序位置1开始的len1长度部分,中序pos位置的左半部分)

    r的右儿子=getRoot(前序位置len1开始右半部分,中序pos位置的右半部分)

    return r

     

    如图1示:

    图1

    输入前序ABDGCEFH,中序DGBAECHF,可以得出

    A为该二叉树的根节点

    1: BDG为该二叉树左子树的前序

    2: DGB为该二叉树左子树的中序

    根据1和2可以构建一棵左子树

     

    3: CEFH为该二叉树右子树的前序

    4: ECHF为该二叉树右子树的中序

    根据3和4可以构建一个右子树

     

    执行至该步骤的时候就得到了该二叉树的云结构,如图2所示,A为根节点,BDG在它的左子树上,CEFG在它的右子树上。

    如此递归即可以构建一棵完整的二叉树

    图2

     

     

    下面是c语言的实现方法(该代码的变量p1,p2,i1,i2,tmp请参考图1):

    1. /* 
    2.  * main.cpp 
    3.  * 
    4.  *  Created on: 2011-4-11 
    5.  *      Author: boyce 
    6.  *      Email:  boyce.ywr@gmail.com 
    7.  */  
    8. #include <stdio.h>  
    9. #include <string.h>  
    10. struct BTreeNode {  
    11.     char e;  
    12.     BTreeNode *left;  
    13.     BTreeNode *right;  
    14. };  
    15. typedef BTreeNode* BTree;  
    16. BTreeNode *createBTreeNode(char e) {  
    17.     BTreeNode *nd = new BTreeNode;  
    18.     nd->e = e;  
    19.     nd->left = NULL;  
    20.     nd->right = NULL;  
    21.     return nd;  
    22. }  
    23. int findChar(const char *str, int s1, int s2, char c) {  
    24.     if (!str || s2 < s1 || s1 < 0 || s2 >= strlen(str))  
    25.         return -1;  
    26.     for (int i = s1; i <= s2; i++) {  
    27.         if (str[i] == c)  
    28.             return i;  
    29.     }  
    30.     return -1;  
    31. }  
    32. BTreeNode *getRoot(char *pre, int p1, int p2, char *in, int i1, int i2) {  
    33.     char rootCh = pre[p1];  
    34.     if (!pre || p2 < p1 || p1 < 0 || p2 >= strlen(pre) || !in || i2 < i1 || i1  
    35.             < 0 || i2 >= strlen(in)) {  
    36.         return NULL;  
    37.     }  
    38.     int tmp = findChar(in, i1, i2, rootCh);  
    39.     if (tmp < 0) {  
    40.         return NULL;  
    41.     }  
    42.     BTreeNode *nd = createBTreeNode(rootCh);  
    43.     nd->left = getRoot(pre, p1 + 1, p1 + tmp - i1, in, i1, tmp - 1);  
    44.     nd->right = getRoot(pre, p1 + tmp - i1 + 1, p2, in, tmp + 1, i2);  
    45.     return nd;  
    46. }  
    47. BTree createBTree(char *pre, char *in) {  
    48.     if (!pre || !in)  
    49.         return NULL;  
    50.     return getRoot(pre, 0, strlen(pre) - 1, in, 0, strlen(in) - 1);  
    51. }  
    52. void printPostOrder(BTree t) {  
    53.     if (!t)  
    54.         return;  
    55.     printPostOrder(t->left);  
    56.     printPostOrder(t->right);  
    57.     printf("%c", t->e);  
    58. }  
    59. void printBTreeNode(BTreeNode *nd, int depth) {  
    60.     for (int i = 0; i < depth - 1; i++)  
    61.         printf("  ");  
    62.     if (depth > 0)  
    63.         printf("--");  
    64.     if (!nd) {  
    65.         printf("*/n");  
    66.         return;  
    67.     }  
    68.     printf("%c/n", nd->e);  
    69.     printBTreeNode(nd->left, depth + 1);  
    70.     printBTreeNode(nd->right, depth + 1);  
    71. }  
    72. void printBTree(BTree t) {  
    73.     printBTreeNode(t, 0);  
    74. }  
    75. int countBTree(BTree t) {  
    76.     if (!t)  
    77.         return 0;  
    78.     return countBTree(t->left) + countBTree(t->right) + 1;  
    79. }  
    80. int main() {  
    81.     char pre[] = "ABDGCEFH";  
    82.     char in[] = "DGBAECHF";  
    83.     BTree t = createBTree(pre, in);  
    84.     printf("Preorder: %s/n", pre);  
    85.     printf("Inorder: %s/n", in);  
    86.     if (countBTree(t) != strlen(pre)) {  
    87.         printf("No such a binary tree!/n");  
    88.         return 0;  
    89.     }  
    90.     printf("Postorder: ");  
    91.     printPostOrder(t);  
    92.     printf("/n");  
    93.     printf("The BTree is (* means no such node):/n");  
    94.     printBTree(t);  
    95.     return 0;  
    96. }  
     

     

    下面是输出结果显示:


  • 相关阅读:
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    1236:区间合并
  • 原文地址:https://www.cnblogs.com/youngforever/p/3104657.html
Copyright © 2011-2022 走看看