zoukankan      html  css  js  c++  java
  • (二叉树 递归) 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;
        }
    };

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

  • 相关阅读:
    HashMap的负载因子为什么默认是0.75?这篇文章告诉你答案
    如何设计短网址系统?
    前端HTML史上最全总结,入门级边学边实战!
    阿里2021最全新的java面试题总结
    三万字,100题!Linux知识汇总!
    程序员路线图
    基于nodejs的selenium的自动化测试之网络元素
    Electron桌面程序入门研究
    Git常用命令
    二次探测法
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10772354.html
Copyright © 2011-2022 走看看