zoukankan      html  css  js  c++  java
  • [leetcode]从中序与后序/前序遍历序列构造二叉树

    从中序与后序遍历序列构造二叉树

    根据一棵树的中序遍历与后序遍历构造二叉树。

    注意:
    你可以假设树中没有重复的元素。

    例如,给出

    中序遍历 inorder = [9,3,15,20,7]
    后序遍历 postorder = [9,15,7,20,3]
    

    返回如下的二叉树:

        3
       / 
      9  20
        /  
       15   7
    

    思路: 根据构造二叉树的流程,中序遍历的访问顺序为左-中-右;后序遍历的方位顺序为左-右-中。

    1. 后序最后一个节点为根节点,在中序列表中查找根节点值
    2. 将中序列表分割成左子树中序列表和右子树中序列表
    3. 因为对于同样的树中序和后序列表长度相同,所以根据左子树中序列表和右子树中序列表的长度将后序列表分割成左子树后序和右子树后序
    4. 对左子树根节点,右子树根节点递归调用
    5. 返回根节点
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) 
    {
        int n=inorder.size();
        if(n>0)
        {
            TreeNode* root=new TreeNode(postorder[n-1]);
            vector<int>::iterator it=find(inorder.begin(),inorder.end(),postorder[n-1]);
            vector<int> il,ir,pl,pr;
            il.assign(inorder.begin(),it);
            ir.assign(it+1,inorder.end());
            int l,r;
            l=il.size();
            r=ir.size();//中序后序遍历长度相等
            pl.assign(postorder.begin(),postorder.begin()+l);
            pr.assign(postorder.begin()+l,postorder.end());
            root->left=buildTree(il,pl);
            root->right=buildTree(ir,pr);
            return root;
        }
        else return NULL;
    }
    

    从前序与中序遍历序列构造二叉树

    根据一棵树的前序遍历与中序遍历构造二叉树。

    注意:
    你可以假设树中没有重复的元素。

    例如,给出

    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    

    返回如下的二叉树:

        3
       / 
      9  20
        /  
       15   7
    

    思路:
    和中序后序构造思路基本一致
    根据构造二叉树的流程,前序遍历的访问顺序为中-左-右,中序遍历的访问顺序为左-中-右。

    1. 前序第一一个节点为根节点,在中序列表中查找根节点值
    2. 将中序列表分割成左子树中序列表和右子树中序列表
    3. 因为对于同样的树中序和前序列表长度相同,所以根据左子树中序列表和右子树中序列表的长度将前序列表分割成左子树前序和右子树前序
    4. 对左子树根节点,右子树根节点递归调用
    5. 返回根节点
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {
        int n=preorder.size();
        if(n>0)
        {
            TreeNode* root=new TreeNode(preorder[0]);
            vector<int>::iterator it=find(inorder.begin(),inorder.end(),preorder[0]);
            vector<int> il,ir,pl,pr;
            il.assign(inorder.begin(),it);
            ir.assign(it+1,inorder.end());
            int l,r;
            l=il.size();
            r=ir.size();//中序前序遍历长度相等
            pl.assign(preorder.begin()+1,preorder.begin()+l+1);
            pr.assign(preorder.begin()+l+1,preorder.end());
            root->left=buildTree(pl,il);
            root->right=buildTree(pr,ir);
            return root;
        }
        else return NULL;
    }
    
  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/wendyy/p/9332633.html
Copyright © 2011-2022 走看看