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;
    }
    
  • 相关阅读:
    Django第一天上课笔记
    easyui-datebox 只能获取当前日期以前的日期
    身份证号码 正则表达式 jquery
    动态修改属性设置 easyUI
    easyUi onLoadSuccess:、onChange这些事件不能嵌套使用!!!!
    jstl无法调用js
    decode
    easyui-panel 滚动条禁用
    js文件引用js文件
    硬编码
  • 原文地址:https://www.cnblogs.com/wendyy/p/9332633.html
Copyright © 2011-2022 走看看