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

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

难度:中等

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

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

例如,给出

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

返回如下的二叉树:

    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>& inorder, vector<int>& postorder) {
        if(postorder.size() != inorder.size())
            return NULL;
        
        if(postorder.empty() || inorder.empty())
            return NULL;
        
        TreeNode* new_node = new TreeNode(postorder[postorder.size()-1]);

        vector<int> postorder_left;
        vector<int> postorder_right;
        vector<int> inorder_left;
        vector<int> inorder_right;
        bool flag = false;
        for(int i = 0; i < inorder.size(); i++)
        {
            if(inorder[i] == postorder[postorder.size()-1])
            {
                flag = true;
                continue;
            }
            if(!flag)
                inorder_left.push_back(inorder[i]);
            else
                inorder_right.push_back(inorder[i]);
        }
        
        for(int j = 0; j < postorder.size()-1; j++)
        {
            if(j < inorder_left.size())
                postorder_left.push_back(postorder[j]);
            else
                postorder_right.push_back(postorder[j]);
        }
        new_node->left = buildTree(inorder_left,postorder_left);
        new_node->right = buildTree(inorder_right,postorder_right);
        
        return new_node;
    }
};

猜你喜欢

转载自blog.csdn.net/L_smartworld/article/details/107411641
今日推荐