zoukankan      html  css  js  c++  java
  • 二叉树遍历序列的求解

    一,由遍历序列构造二叉树

            

        上面为一个二叉树,可知它的遍历序列分别为:

                          先序遍历:ABDECFG

                          中序遍历:DBEAFCG

                          后序遍历:DEBFGCA

        我们需要知道的是,由二叉树的先序序列中序序列可以唯一地确定一棵二叉树;由二叉树的后序序列中序序列也可以唯一地确定一棵二叉树;但是如果只知道先序序列和后序序列,则无法唯一确定一棵二叉树。


    二,已知二叉树的先序序列和中序序列,求后序序列。

        因为由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树,所以进而可以唯一地确定它的后序遍历。在先序遍历序列中,第一个结点一定是二叉树的根结点,而在中序遍历中,根结点必然将中序序列分割成两个子序列,前一个子序列就是左子树的中序序列,后一个子序列就是右子树的中序序列。根据这两个子序列的长度,可以在先序序列中找到对应的左子树先序序列和右子树先序序列。而左子树先序序列的第一个结点是左子树的根结点,右子树先序序列的第一个结点是右子树的根结点。如此递归地进行下去,便能唯一地确定这棵二叉树。

    C++实现:

    /*************************************************************************
    	> File Name: Test.cpp
    	> Author: SongLee
    	> E-mail: lisong.shine@qq.com 
    	> Created Time: 2014年03月20日 星期四 17时11分31秒
        > Personal Blog: http://songlee24.github.io/
     ************************************************************************/
    #include<iostream>
    using namespace std;
    
    struct TreeNode
    {
        struct TreeNode* left;
        struct TreeNode* right;
        char elem;
    };
    
    
    TreeNode* PostOrderFromOrderings(char* inorder, char* preorder, int length)
    {
        if(length == 0)
        {
            return NULL;
        }
        TreeNode* node = new TreeNode;
        node->elem = *preorder;
        int rootIndex = 0;
        for(; rootIndex < length; rootIndex++)  // 求左子树的长度
        {
            if(inorder[rootIndex] == *preorder)
                break;
        }
        node->left = PostOrderFromOrderings(inorder, preorder + 1, rootIndex);
        node->right = PostOrderFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1));
        cout << node->elem << " ";   // 求后序序列,所以最后输出根结点
        return node;
    }
    
    
    int main()
    {
        char* pre = "ABDECFG";
        char* in = "DBEAFCG";
        PostOrderFromOrderings(in, pre, 7);
        cout << endl;
        return 0;
    }



    三, 已知二叉树的后序序列和中序序列,求先序序列。

          同理,由二叉树的后序序列和中序序列也可以唯一地确定一棵二叉树,所以进而可以唯一地确定先序遍历序列。因为后序序列的最后一个结点就如同先序序列的第一个结点,可以将中序序列分割成两个子序列,然后采用类似的方法递归地进行划分。

    C++实现:

    /*************************************************************************
    	> File Name: Test1.cpp
    	> Author: SongLee
    	> E-mail: lisong.shine@qq.com 
    	> Created Time: 2014年03月20日 星期四 21时56分57秒
        > Personal Blog: http://songlee24.github.io/
     ************************************************************************/
    #include<iostream>
    using namespace std;
    
    struct TreeNode
    {
        struct TreeNode* left;
        struct TreeNode* right;
        char elem;
    };
    
    
    TreeNode* PreOrderFromOrderings(char* inorder, char* postorder, int length)
    {
        if(length == 0)
        {
            return NULL;
        }
        TreeNode* node = new TreeNode;
        node->elem = postorder[length-1];
        int rootIndex = 0;
        for(; rootIndex < length; rootIndex++)   // 求左子树的长度
        {
            if(inorder[rootIndex] == postorder[length-1])
                break;
        }
        cout << node->elem << " ";   // 求先序序列,所以先输出根结点
        node->left = PreOrderFromOrderings(inorder, postorder, rootIndex);
        node->right = PreOrderFromOrderings(inorder + rootIndex + 1, postorder + rootIndex, length - (rootIndex + 1));
        return node;
    }
    
    
    int main()
    {
        char* post = "DEBFGCA";
        char* in = "DBEAFCG";
        PreOrderFromOrderings(in, post, 7);
        cout << endl;
        return 0;
    }



    个人站点:http://songlee24.github.io/

  • 相关阅读:
    剑指Offer——构建乘积数组
    剑指Offer——把二叉树打印成多行
    剑指Offer——二叉树的下一个结点
    剑指Offer——二叉搜索树与双向链表
    剑指Offer——二叉搜索树的后序遍历序列
    LeetCode——Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode——Construct Binary Tree from Preorder and Inorder Traversal
    剑指Offer——重建二叉树2
    C++ STL基本容器的使用
    mysql中模糊查询的四种用法介绍
  • 原文地址:https://www.cnblogs.com/songlee/p/5738163.html
Copyright © 2011-2022 走看看