欢迎来到PJCK的博客

(二叉树 递归) leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

For example, given

inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]

Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

-------------------------------------------------------------------------------------
就是从中序遍历和后序遍历构建二叉树。可以用递归方式。注意递归的终止条件。
 leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal 几乎一样。

参考博客:http://www.cnblogs.com/grandyang/p/4296193.html

C++代码:
/**
 * 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) {
        return build(inorder,0,inorder.size()-1,postorder,0,postorder.size() - 1);
    }
    TreeNode *build(vector<int> &inorder,int ileft,int iright,vector<int> &postorder,int pleft,int pright){
        if(ileft > iright ||pleft > pright) return NULL;  //终止条件,就是当序列的长度为0时,递归终止。
        int i = 0;
        TreeNode *cur = new TreeNode(postorder[pright]);
        for(i = ileft; i < inorder.size(); i++){
            if(inorder[i] == cur->val)
                break;
        }
        cur->left = build(inorder,ileft,i-1,postorder,pleft,pleft + i - ileft - 1);
        cur->right = build(inorder,i + 1,iright,postorder,pleft + i - ileft,pright - 1);
        return cur;
    }
};

 还有一个方法,就是建立几个数组,保存分割后的数组。不过时间会很长。

C++代码:

/**
 * 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) {
        return build(inorder,postorder);
    }
    TreeNode *build(vector<int> &inorder,vector<int> &postorder){
        if(inorder.size() == 0 || postorder.size() == 0)  //递归条件,当然也可以加上if(inorder.size() == 1 || postorder.size() == 1)return cur;这个递归条件。
            return NULL;
        int rootval = postorder.back();
        TreeNode *cur = new TreeNode(rootval);
        int i = 0;
        for(i = 0; i < inorder.size(); i++){
            if(inorder[i] == rootval) break;
        }
        vector<int> inleft,inright;
        vector<int> poleft,poright;
        for(int j = 0; j < i; j++){
            inleft.push_back(inorder[j]);
            poleft.push_back(postorder[j]);
        }
        for(int j = i + 1; j < inorder.size(); j++){
            inright.push_back(inorder[j]);
        }
        for(int j = i; j < postorder.size() - 1; j++){
            poright.push_back(postorder[j]);
        }
        cur->left = build(inleft,poleft);
        cur->right = build(inright,poright);
        return cur;
    }
};

 这两个方法从算法上看是一样的,只是代码的实现不同而已。

posted @ 2019-04-26 09:09  PJCK  阅读(180)  评论(0编辑  收藏  举报