zoukankan      html  css  js  c++  java
  • 【剑指offer】重建二叉树

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    分析:

    1.前序遍历的第一个为根结点,在中序遍历中找到根结点的位置index

    2.中序遍历中index左边的为左子树的中序遍历,假设结点个数为k,中序遍历中index的右边为右子树的中序遍历

    3.前序遍历中第一个元素(根节点)后的k个元素的左子树的前序遍历,后面剩余的元素为右子树的前序遍历

    class Solution
    {
    public:
        TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
        {
            if(pre.size()==0||in.size()==0)
                return NULL;
    
            vector<int> preleft,preright;
            vector<int> inleft,inright;
            
            //
            TreeNode *root=new  TreeNode(pre[0]);
            
            //找到中序遍历中根的位置index
            int index;
            for(int i=0; i<in.size(); i++)
            {
                if(in[i]==pre[0])
                {
                    index=i;
                    break;
                }
            }
            
            //为左右子树确定中序遍历的元素
            int c=0;
            for(int i=0; i<in.size(); i++)
            {
                if(i<index)
                    inleft.push_back(in[i]),c++;
                else if(i>index)
                    inright.push_back(in[i]);
            }
            
            //为左右子树确定前序遍历的元素
            for(int i=1; i<c+1; i++)
            {
                preleft.push_back(pre[i]);
            }
            for(int i=c+1; i<pre.size(); i++)
            {
                preright.push_back(pre[i]);
            }
            
            //递归构造
            root->left=reConstructBinaryTree(preleft,inleft);
            root->right=reConstructBinaryTree(preright,inright);
            
            return root;
        }
    
    };
  • 相关阅读:
    Stupid Tower Defense
    Lifting the Stone
    城市地平线
    BestCoder Sequence
    Miaomiao's Geometry
    Rating
    Turn the pokers
    Peter's Hobby
    HTTP关键词收集
    HTTP出现前的协议
  • 原文地址:https://www.cnblogs.com/yinbiao/p/11568261.html
Copyright © 2011-2022 走看看