• LeetCode-Construct Binary Tree from Inorder and Postorder Traversal


    数据结构的基础知识,根据中序、后序遍历或者先序、中序遍历构建二叉树;

    典型的递归;

    中序、后序的代码:

     1 /**
     2  * Definition for binary tree
     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         // Start typing your C/C++ solution below
    14         // DO NOT write int main() function
    15         int m = inorder.size();
    16         int n = postorder.size();
    17         if (m != n || !m || !n) {
    18             return NULL;
    19         }
    20         return build(inorder, 0, m - 1, postorder, 0, n - 1);
    21     }
    22     TreeNode *build(vector<int> &inorder, int m1, int m2, vector<int> &postorder, int n1, int n2) {
    23         if (m1 > m2) {
    24             return NULL;
    25         }
    26         TreeNode* node = new TreeNode(postorder[n2]);
    27         int i;
    28         for (i = m1; i <= m2; ++i) {
    29             if (inorder[i] == postorder[n2]) {
    30                 break;
    31             }
    32         }
    33         node->left = build(inorder, m1, i - 1, postorder, n1, n1 + i - 1 - m1);
    34         node->right = build(inorder, i + 1, m2, postorder, n2 - m2 + i, n2 - 1);
    35         return node;
    36     }
    37 };

    先序、中序的代码:

     1 /**
     2  * Definition for binary tree
     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         // Start typing your C/C++ solution below
    14         // DO NOT write int main() function
    15         int m = preorder.size();
    16         int n = inorder.size();
    17         if (m != n || !m || !n) {
    18             return NULL;
    19         }
    20         return build(preorder, 0, m - 1, inorder, 0, n - 1);
    21     }
    22     TreeNode *build(vector<int> &preorder, int m1, int m2, vector<int> &inorder, int n1, int n2) {
    23         if (m1 > m2) {
    24             return NULL;
    25         }
    26         int i;
    27         for(i = n1; i <= n2; ++i) {
    28             if (inorder[i] == preorder[m1]) {
    29                 break;
    30             }
    31         }
    32         TreeNode* node = new TreeNode(preorder[m1]);
    33         node->left = build(preorder, m1 + 1, i - n1 + m1, inorder, n1, i - 1);
    34         node->right = build(preorder, i - n1 + m1 + 1, m2, inorder, i + 1, n2);
    35         return node;
    36     }
    37 };
  • 相关阅读:
    一个兼容各浏览器的阻止冒泡的StopPropagation解决方案
    百度面试题:从输入URL到显示网页,后台发生了什么?
    三角形面积公式S=(1/2)absinC的证明
    正弦定理证明(方法二)
    高中数学总结(高一上半部分内容)
    解析几何部分
    正弦定理的证明(方法一)
    平面向量的坐标表示
    将三角函数值转换为角度
    余弦定理方法证明
  • 原文地址:https://www.cnblogs.com/chasuner/p/treeorder.html
Copyright © 2020-2023  润新知