zoukankan      html  css  js  c++  java
  • Construct Binary Tree

    105. Construct Binary Tree from Preorder and Inorder Traversal

    题目链接:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/#/description

    题目大意:给定一棵树的先序和中序遍历,要求构造出该二叉树。

    题目思路:由先序遍历的特性知道,先序遍历的首元素即为根节点元素,根据中序遍历的特性知道,根节点元素将中序遍历结果划分为左子树和右子树,即根元素以左的部分为左子树的中序遍历结果,根元素以右的部分为右子树的中序遍历结果,根据中序遍历的左右子树划分结果(左右子树的节点个数),又可以将先序遍历结果划分为左右子树,从而递归可以得到整个二叉树。

    算法复杂度:时间复杂度O(n),空间复杂度O(log(n)),n为节点个数

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    13         if (preorder.size() == 0 || inorder.size() == 0)
    14             return nullptr;
    15         return recursiveBuildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
    16     }
    17     TreeNode* recursiveBuildTree(vector<int>& preorder, int pbegin, int pend, vector<int>& inorder, int ibegin, int iend) {
    18         if (pbegin > pend)
    19             return nullptr;
    20         TreeNode* root = new TreeNode(preorder[pbegin]);
    21         if (pbegin == pend)
    22             return root;
    23         for (int i = ibegin, j = 0; i <= iend; ++i, ++j)
    24             if (inorder[i] == preorder[pbegin]) {
    25                 root->left = recursiveBuildTree(preorder, pbegin + 1, pbegin + j, inorder, ibegin, i - 1);
    26                 root->right = recursiveBuildTree(preorder, pbegin + j + 1, pend, inorder, i + 1, iend);
    27                 break;
    28             }
    29         return root;
    30     }
    31 };

    评测系统上运行结果:

    106. Construct Binary Tree from Inorder and Postorder Traversal

    题目链接:https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/#/description

    题目大意:给定一棵树的中序和后序遍历,要求构造出该二叉树。

    题目思路:由后序遍历的特性知道,后序遍历的尾元素即为根节点元素,根据中序遍历的特性知道,根节点元素将中序遍历结果划分为左子树和右子树,即根元素以左的部分为左子树的中序遍历结果,根元素以右的部分为右子树的中序遍历结果,根据中序遍历的左右子树划分结果(左右子树的节点个数),又可以将后序遍历结果划分为左右子树,从而递归可以得到整个二叉树。

    算法复杂度:时间复杂度O(n),空间复杂度O(log(n)),n为节点个数

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
    13         if (inorder.empty())
    14             return nullptr;
    15         return recurBuildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
    16     }
    17 private:
    18     TreeNode* recurBuildTree(vector<int>& inorder, int ibeg, int iend, vector<int>& postorder, int pbeg, int pend) {
    19         if (ibeg > iend)
    20             return nullptr;
    21         auto root = new TreeNode(postorder[pend]);
    22         for (int i = ibeg, j = 0; i <= iend; ++i, ++j) {
    23             if (inorder[i] == postorder[pend]) {
    24                 root->left = recurBuildTree(inorder, ibeg, i - 1, postorder, pbeg, pbeg + j - 1);
    25                 root->right = recurBuildTree(inorder, i + 1, iend, postorder, pbeg + j, pend - 1);
    26                 break;
    27             }
    28         }
    29         return root;
    30     }
    31 };

    评测系统上运行结果:

  • 相关阅读:
    Sqlite数据库的加密
    利用Cache缓存数据DataTable数据提高大数据量访问性能
    MYSQL数据库主主同步实战
    【误人子弟】《ASP.NET常用语句120条,(很实用的)
    Debian 添加 FreeBSD 内核支持
    FIREBIRD的基本数据类型
    扩大Portable Ubuntu的系统可用空间
    SQL语句 按年龄段分组统计人数问题
    aspx 页面,master页面与ascx用户控件传值的问题
    MonoDevelop 2.0 Released 发布
  • 原文地址:https://www.cnblogs.com/gxhblog/p/6658635.html
Copyright © 2011-2022 走看看