标签:
通过二叉树的先序和中序,或者先序和后序遍历可以重建这棵二叉树。由先序遍历可以找出二叉树的根节点的值,再去中序/后序遍历中将节点分为左子树和右子树的节点。
一般地,有迭代和递归两种方法去重建一棵二叉树。递归比较耗时,而且确定边界时容易出错,以下代码采用迭代,时间复杂度O(n),n为树节点数。
参照先序遍历的迭代的思想,总是把左子树的左节点优先push入栈。
当栈顶元素s.top() == inorder[0]时,则说明已到达树的最左的叶子节点,随后按照先序遍历迭代思想,转向右子树。
这里设置了一个flag标志位,flag = 1转向右子树,默认flag=0持续将左子树左节点入栈。
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 //用迭代的方法替换递归 11 class Solution { 12 public: 13 struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) { 14 if (pre.size() == 0 || in.size() == 0) 15 return NULL; 16 stack<TreeNode *> s; 17 int i = 0; //pre的index 18 int j = 0; //in的index 19 int flag = 0; //flag = 1转向右子树 20 TreeNode *root = new TreeNode(pre[i]); 21 TreeNode *temp = root; 22 s.push(temp); 23 i++; //push一个,则i++ 24 while (i < pre.size()){ 25 if (!s.empty() && s.top()->val == in[j]){ 26 temp = s.top(); 27 s.pop(); 28 flag = 1; 29 j++; 30 }else{ 31 if (flag == 0){ 32 temp->left = new TreeNode(pre[i]); 33 temp = temp->left; 34 s.push(temp); 35 i++; 36 }else{ 37 flag = 0; 38 temp->right = new TreeNode(pre[i]); 39 temp = temp->right; 40 s.push(temp); 41 i++; 42 } 43 } 44 } 45 return root; 46 } 47 };
标签:
原文地址:http://www.cnblogs.com/cnblogsnearby/p/4737599.html