您的位置:首页 > 编程语言 > C语言/C++

leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal

2017-02-16 13:30 375 查看
递归的解法基本上大家都很清楚,这里介绍一下非递归的一个实现。

首先我们需要维护一个堆栈,先压入树的根节点(后序遍历最后一个节点),接下来:

1、比较栈顶元素与中序遍历的最后一个元素是否相等:

①不相等

说明栈顶元素存在右子树,而由后序遍历的特征可知,该栈顶元素的右孩子正是此时后序遍历vector的最后一个元素。

我们将该栈顶元素的右孩子置为后序遍历vector的最后一个元素,然后再压入该右孩子,回到第一步。

②相等

说明栈顶元素不存在右子树,因此我们要做的第一件事情是先将栈顶元素出栈,用指针p指向它,再pop掉中序遍历vector

的最后一个元素。接下来我们再看后序遍历vector的最后一个元素,由后序遍历的特征可知,该元素可能是节点p的父节点,

也可能是节点p的左孩子,这要如何判断呢?很简单,由①不相等的情况可知,此时堆栈中的栈顶元素(p出栈后)正是p元素的

父节点,更准确的说,p节点是此时栈顶元素的右孩子(由①保证)。于是,我们只需要比较一下,该栈顶元素与后序遍历vector

的最后一个元素是否相等即可。如果相等,很简单,说明p节点没有左孩子,回到第一步去处理p的父节点。如果不相等,说明该

节点就是p的左孩子,设置好后,再将其压入堆栈,回到第一步。

2、显然,当中序遍历序列vector为空时算法执行完毕。

class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
{
if (inorder.empty())
{
return nullptr;
}
TreeNode *root = new TreeNode(postorder.back());
postorder.pop_back();
stack<TreeNode*> stack;
stack.push(root);
while (true)
{
if (stack.top()->val != inorder.back())
{
TreeNode *p = new TreeNode(postorder.back());
postorder.pop_back();
stack.top()->right = p;
stack.push(p);
}
else
{
TreeNode *p = stack.top();
stack.pop();
inorder.pop_back();
if (inorder.empty())
{
break;
}
if (stack.size() && stack.top()->val == inorder.back())
{
continue;
}
p->left = new TreeNode(postorder.back());
postorder.pop_back();
stack.push(p->left);
}
}
return root;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐