Leetcode刷题笔记题解(C++):105. 从前序与中序遍历序列构造二叉树

Leetcode刷题笔记题解(C++):105. 从前序与中序遍历序列构造二叉树_第1张图片

前序遍历的第一个肯定是根节点,在中序遍历中根节点的左边是左子树, 右边是右子树,可以使用dfs搜索

遍历查找左子树,先序遍历中第一个元素下一个开始到size_lefttree的长度作为左子树的前序遍历,剩下的作为右子树的前序遍历,中序遍历中根节点左边的作为左子树的中序遍历,右边的作为右子树的中序遍历

 代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    mapm;
    TreeNode* buildTree(vector& preorder, vector& inorder) {
        for(int i=0;i& preorder, vector& inorder,int preL,int preR,int inL,int inR){
        if(preL>preR) return NULL;
        //前序遍历的第一个节点为根节点
        TreeNode * tree=new TreeNode(preorder[preL]);
        //找出根节点在中序遍历中的位置,方便确定左右子树
        int k=m[preorder[preL]];
        //计算出左子树的大小
        int size_lefttree=k-inL;
        //遍历查找左子树,先序遍历中第一个元素下一个开始到size_lefttree的长度作为左子树的前序遍历,剩下的作为右子树的前序遍历,中序遍历中根节点左边的作为左子树的中序遍历,右边的作为右子树的中序遍历
        tree->left=fun(preorder,inorder,preL+1,preL+size_lefttree,inL,k-1);
        //遍历查找右子树
        tree->right=fun(preorder,inorder,preL+size_lefttree+1,preR,k+1,inR);
        return tree;
    } 
};

 

你可能感兴趣的:(Leetcode算法题解,二叉树,数据结构,算法,前序遍历,leetcode)