LeetCode-----第105题-----从前序与中序遍历序列构造二叉树

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

难度:中等

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

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

例如,给出

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

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

题目分析:

       前序遍历是根左右,找到根节点的值,建立新节点,然后将中序遍历的数组分成左右两块,再将前序遍历分成左右两块,最后新节点的左右子树连接递归调用。

参考代码:

/**
 * 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:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size() != inorder.size())
            return NULL;
        
        if(preorder.empty() || inorder.empty())
            return NULL;
        
        //建立新节点,为根节点
        TreeNode* new_node = new TreeNode(preorder[0]);

        vector<int> preorder_left;
        vector<int> preorder_right;
        vector<int> inorder_left;
        vector<int> inorder_right;
        bool flag = false;
        //将中序遍历数组分为左右两块
        for(int i = 0; i < inorder.size(); i++)
        {
            if(inorder[i] == preorder[0])
            {
                flag = true;
                continue;
            }
            if(!flag)
                inorder_left.push_back(inorder[i]);
            else
                inorder_right.push_back(inorder[i]);
        }
        //将前序遍历数组分为左右两块
        for(int j = 1; j < preorder.size(); j++)
        {
            if(j <= inorder_left.size())
                preorder_left.push_back(preorder[j]);
            else
                preorder_right.push_back(preorder[j]);
        }
        //进行递归调用,并且和新节点连接起来
        new_node->left = buildTree(preorder_left,inorder_left);
        new_node->right = buildTree(preorder_right,inorder_right);
        
        return new_node;
    }
};

猜你喜欢

转载自blog.csdn.net/L_smartworld/article/details/107411449