码迷,mamicode.com
首页 > 其他好文 > 详细

【二叉树】重建二叉树

时间:2015-08-17 21:31:19      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:

leetcode105

通过二叉树的先序和中序,或者先序和后序遍历可以重建这棵二叉树。由先序遍历可以找出二叉树的根节点的值,再去中序/后序遍历中将节点分为左子树和右子树的节点。

一般地,有迭代和递归两种方法去重建一棵二叉树。递归比较耗时,而且确定边界时容易出错,以下代码采用迭代,时间复杂度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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!