zoukankan      html  css  js  c++  java
  • 剑指offer重构二叉树 给出二叉树的前序和后序重构二叉树

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
    假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
    例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
    则重建二叉树并输出它的后序遍历序列。
    (测试用例中,"树"的输出形式类似于树的层次遍历,没有节点的用#来代替)
    先序遍历:先遍历根节点,再遍历左子树,再遍历右子树,对子树采用相对规则遍历。
    后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点,对子树采用相同规则。
    分析:
     
    1:每棵前序遍历的第一个元素,一定是这个树的根节点
    2:对每棵树遍历后序遍历序列,找到与根节点元素相等节点的位置pos,根据后序遍历的特点,根节点向左的序列为做子树的后序遍历序列{4, 7, 2},根节点向右的序列为右子树的后序遍历序列{5, 3,  8, 6}.
    3:根据根节点的位置可以节点的位置,可以分别求出,左右子树节点数量,这样可以在前序遍历中确认,左右子树的的前序遍历分别为{2, 4, 7},{3, 5, 6, 8}
    4:对左右子树重复1,2,3步。
    5:递归返回条件,一个节点不存在子树时返回。
     
    c++代码实现
     
    class Solution {
        public:
            struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
                if (pre.empty() || in.empty()) return NULL;
                TreeNode *root = NULL;
                root = Constructcore(pre, in, 0, (int)pre.size()-1, 0, (int)in.size()-1);
                return root;
            }
            TreeNode *Constructcore(vector<int> pre, vector<int> in,
                                    int startPre, int endPre,
                                    int startIn, int endIn ){
                
                int rootValue = pre[startPre];
                TreeNode *root = new TreeNode(rootValue);
                if (startPre == endPre){
                    if (startIn == endIn &&pre[startPre] == in[startIn])
                    return root;
                }
                int pos;
                for (pos = startIn; pos <= endIn; pos++){
                    if (pre[startPre] == in[pos]) break;
                }
                int leftlength = pos - startIn;
                int rightlength = endIn - pos;
                if (leftlength > 0){
                    
                    root->left = Constructcore(pre, in, startPre + 1,startPre + 1 +leftlength,
                                                        startIn,     pos - 1
                                               );
                }
                if (rightlength > 0){
                    root->right = Constructcore(pre, in, startPre + 1 + leftlength, endPre,
                                                         pos + 1,            endIn
                    
                    );
                }
                return root;
            }
            
        };
     
  • 相关阅读:
    类似qq弹窗,自动消失
    词法分析实验报告
    编译原理
    开发中遇到的杂七杂八
    Gradle+Jetty实现静态资源的热部署
    Eclipse中进行Gradle+Jetty部署的web项目的断点调试
    俳句与短歌收藏
    影评收藏
    诗歌与词曲收藏
    歌词收藏
  • 原文地址:https://www.cnblogs.com/code-changeworld/p/4543696.html
Copyright © 2011-2022 走看看