• [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;
    }
    
  • 相关阅读:
    AutoCompleteTextView 简单用法
    照片颠倒问题及查询摄像头参数问题的解决
    Android Studio-引用jar及so文件
    file新建文件及文件夹
    appcompat_v7报错
    fresco加载本地图片、gif资源
    android根据图片路径显示图片
    sublime text3 及相关的安装
    win 10通过自带IIS搭建ftp
    LCA
  • 原文地址:https://www.cnblogs.com/wendyy/p/9332633.html
Copyright © 2020-2023  润新知