【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 }

 

posted @ 2015-05-16 17:33  LizSep  阅读(337)  评论(0编辑  收藏  举报