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

[LeetCode系列] 从中序遍历和后序遍历序列构造二叉树(迭代解法)

时间:2014-11-04 16:39:28      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   os   for   sp   div   

给定中序遍历inorder和后序遍历postorder, 请构造出二叉树.

算法思路: 设后序遍历为po, 中序遍历为io.

 

  • 首先取出po的最后一个节点作为根节点, 同时将这个节点入stn栈;
  • 随后比较io的最后一个节点和stn栈顶节点:
    • 如果不同则将此节点添加到栈顶节点的右侧并入stn栈, 同时从po中删除这个节点;
      • 此时的栈中保存了所有还未处理左子树的右侧根节点
      • 出现一次不同, 右侧子树的深度就增加1, 栈的深度就代表了当前右侧子树的深度
    • 如果相同, 先缓存栈顶节点, 分别删除io和栈顶元素:
      • 如果依旧相同(说明本层没有左子树), 则返回第2步;
      • 如果不同(说明有左子树), 则将po的最后一个节点添加到缓存节点p的左侧, 同时将左子树入栈并从po中删除此节点, 返回第2步;

代码:

 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 class Solution {
11 public:
12     TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
13         if(inorder.size() == 0)return NULL;
14         TreeNode *p;
15         TreeNode *root;
16         stack<TreeNode *> stn;
17         
18         root = new TreeNode(postorder.back()); 
19         stn.push(root); 
20         postorder.pop_back(); 
21         
22         while(true)
23         {
24             if(inorder.back() == stn.top()->val) 
25             {
26                 p = stn.top();
27                 stn.pop(); 
28                 inorder.pop_back(); 
29                 if(inorder.size() == 0) break;
30                 if(stn.size() && inorder.back() == stn.top()->val)
31                     continue;
32                 p->left = new TreeNode(postorder.back()); 
33                 postorder.pop_back();
34                 stn.push(p->left);
35             }
36             else 
37             {
38                 p = new TreeNode(postorder.back());
39                 postorder.pop_back();
40                 stn.top()->right = p; 
41                 stn.push(p); 
42             }
43         }
44         return root;
45     }
46 };

 

[LeetCode系列] 从中序遍历和后序遍历序列构造二叉树(迭代解法)

标签:style   blog   io   color   ar   os   for   sp   div   

原文地址:http://www.cnblogs.com/lancelod/p/4073739.html

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