leetcode第145题:二叉树的后序遍历
https://leetcode-cn.com/problems/binary-tree-postorder-traversal/
【题目】
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
【思路】
后序遍历,递归方法和前序遍历、中序遍历类似。
迭代方法,需要使用栈存储节点,并且使用visit存储访问次数。当对应的visit元素为0时,遍历左子树;为1时,遍历右子树;为2时,元素值加入结果,弹出节点。
【代码】
python版本
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:
return []
res = []
ls = [root]
visit = [0]
while len(ls) > 0:
# 未访问过,先访问左子树
if visit[-1] == 0:
visit[-1] = 1
if ls[-1].left:
ls.append(ls[-1].left)
visit.append(0)
# 访问右子树
elif visit[-1] == 1:
visit[-1] = 2
if ls[-1].right:
ls.append(ls[-1].right)
visit.append(0)
# 访问根节点
else:
res.append(ls[-1].val)
ls.pop()
visit.pop()
return res
C++版本
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if(!root)
return res;
stack<TreeNode*> ls;
stack<int> visit;
ls.push(root);
visit.push(0);
while(ls.size() > 0){
// 未访问,访问左子树
if(visit.top() == 0){
visit.top() = 1;
if(ls.top()->left){
ls.push(ls.top()->left);
visit.push(0);
}
}else{
// 访问过一次,则访问右子树
if(visit.top() == 1){
visit.top() = 2;
if(ls.top()->right){
ls.push(ls.top()->right);
visit.push(0);
}
}else{
// 访问过两次,弹出元素
res.push_back(ls.top()->val);
visit.pop();
ls.pop();
}
}
}
return res;
}
};