zoukankan      html  css  js  c++  java
  • 【Leetcode】【Medium】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.

    解题思路:

    给出一个二叉树的中序和后序遍历结果,还原这个二叉树。

    对于一个二叉树:

             1
           /  
          2    3
         /   / 
        4  5  6  7

    后序遍历结果为:4 5 2 6 7 3 1

    中序遍历结果为:4 2 5 1 6 3 7

    由此可以发现规律:

    1、后序遍历的最后一个字符,就是根结点(1)

    2、发现根节点后,对应在中序遍历中的位置,则在中序遍历队列中,根节点左边的元素构成根的左子树,根的右边元素构成根的右子树;

    3、递归的将左右子树也按照上述规律进行构造,最终还原二叉树。

    代码:

     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 
    11 class Solution {
    12 public:
    13     TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
    14         return buildSubtree(postorder, inorder, 0, 
    15                             postorder.size()-1, 
    16                             0, inorder.size()-1);
    17     }
    18     
    19     TreeNode* buildSubtree(vector<int>& postorder, vector<int>& inorder, 
    20                         int p_left, int p_right, int i_left, int i_right) {
    21         if (p_left > p_right || i_left > i_right)
    22             return NULL;
    23         
    24         int root = postorder[p_right];
    25         TreeNode* node = new TreeNode(postorder[p_right]);
    26         
    27         int range = 0;
    28         for (int j = i_left; j <= i_right; ++j) {
    29             if (root == inorder[j]) {
    30                 range = j - i_left;
    31                 break;
    32             }
    33         }
    34         
    35         node->left = buildSubtree(postorder, inorder, 
    36                                 p_left, p_left + range - 1, 
    37                                 i_left, i_left + range - 1);
    38         node->right = buildSubtree(postorder, inorder, 
    39                                 p_left + range, p_right - 1, 
    40                                 i_left + range + 1, i_right);
    41         return node;
    42     }
    43 };
  • 相关阅读:
    记录nginx 搭建集群环境踏过的坑
    工作中常见问题
    自定义WebViewPage,实现Url.Action生成绝对地址
    上传阿里云样式文件不解析问题一例总结
    EF4.4 升级EF6.0问题总结
    记一次数据库迁移遇到问题
    javascript 中 !~ 什么意思
    jquery.mobile 中 collapsible-set collapsible listview 共同布局问题
    T-sql脚本规范
    EasyUI使用技巧总结
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4518691.html
Copyright © 2011-2022 走看看