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