zoukankan      html  css  js  c++  java
  • 【Tree】已知前序和中序遍历还原二叉树

     1 /**************************
     2 https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
     3 @date 2015.5.16
     4 @description
     5 根据前序和中序遍历,重构二叉树
     6 可用迭代,也可以使用递归。
     7 递归前面已经写过,耗时,这里再次做使用迭代。
     8 
     9 @tags tree, array, depth-first search
    10 @solution
    11 这里tag里有DFS,迭代和递归都用到。
    12 参照先序遍历的迭代的思想,总是把左子树的左节点优先push入栈。
    13 当栈顶元素s.top() == inorder[0]时,则说明已到达树的最左的叶子节点,随后按照先序遍历迭代思想,转向右子树。
    14 这里设置了一个flag标志位,flag = 1转向右子树,默认flag=0持续将左子树左节点入栈。
    15 ***************************/
    16 #include <iostream>
    17 #include <vector>
    18 #include <stack>
    19 
    20 using namespace std;
    21 
    22 struct TreeNode{
    23     int val;
    24     TreeNode *left, *right;
    25     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    26 };
    27 
    28 class Solution {
    29 public:
    30     TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder){
    31         if (preorder.size() == 0)
    32             return NULL;
    33 
    34         stack<TreeNode *> s;
    35 
    36         int i = 0; // 指向先序遍历向量
    37         int j = 0; // 指向中序遍历向量
    38         int flag = 0; // flag = 0指向左子树,当flag = 1指向右子树
    39 
    40         TreeNode *root = new TreeNode(preorder[i]);
    41         s.push(root);
    42         TreeNode *temp = root;
    43 
    44         i++;
    45 
    46         while (i < inorder.size()){
    47             if (!s.empty() && s.top()->val == inorder[j]){
    48                 temp = s.top(); // 重要,更换temp
    49                 s.pop();
    50                 flag = 1;
    51                 j++;
    52             } else{
    53                 if (flag == 0){
    54                     temp->left = new TreeNode(preorder[i]);
    55                     temp = temp->left;
    56                     s.push(temp);
    57                     i++;
    58                 } else{
    59                     flag = 0; // 右节点不连续添加
    60                     temp->right = new TreeNode(preorder[i]);
    61                     temp = temp->right;
    62                     s.push(temp);
    63                     i++;
    64                 }
    65             }
    66         }
    67         return root;
    68 
    69     }
    70 
    71 
    72 };
    73 
    74 int main(){
    75     vector<int> preorder = {1, 2, 4, 5, 3, 6, 7};
    76     vector<int> inorder = {4, 2, 5, 1, 6, 3, 7};
    77     TreeNode * root;
    78     Solution a;
    79     root = a.buildTree(preorder, inorder);
    80     cout << root->val << endl;
    81     cout << root->left->val << endl;
    82     cout << root->right->val << endl;
    83 }
  • 相关阅读:
    SQLDirect 6.5 Source (Delphi 5-10.1 Berlin)
    中国自主X86处理器工艺跃进:国产28nm升级16nm(上海兆芯)
    底层库
    An Overview of Complex Event Processing2
    linux动态库编译和使用
    gulp
    Web前端性能优化
    ECLIPSE JSP TOMCAT 环境搭建
    项目架构mvc+webapi
    HTTP/1.1
  • 原文地址:https://www.cnblogs.com/cnblogsnearby/p/4508203.html
Copyright © 2011-2022 走看看