LeetCode 145 题, Binary Tree Postorder Traversal 解题思路。
1、先读题,题目要求后序遍历,用非递归解决。
递归解决很容易,代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# 黄哥Python培训 黄哥所写
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res = []
def dfs(root):
if root is None:
return []
if root is not None:
dfs(root.left)
dfs(root.right)
res.append(root.val)
dfs(root)
return res2、循环后序遍历,黄哥用了一个稍微简单的一点的方法,使用二个栈 + 先添加左子树的方法。 dfs 遍历,用栈1 添加左子树,右子树,每循环一次,栈1 pop(), 将node 添加到栈2 中去。
请看代码。
Python3 代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# 黄哥Python培训 黄哥所写
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res = []
if root is None:
return res
stack1 = [root]
stack2 = []
while stack1:
node = stack1.pop()
stack2.append(node)
if node:
if node.left:
stack1.append(node.left)
if node.right:
stack1.append(node.right)
while stack2:
res.append(stack2.pop().val)
return resGo 代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// 黄哥Python培训 黄哥所写
func postorderTraversal(root *TreeNode) []int {
var res []int
if root == nil {
return res
}
s1 := []*TreeNode{root}
s2 := []*TreeNode{}
for len(s1) > 0 {
node := s1[len(s1)-1]
s1 = s1[:len(s1)-1]
s2 = append(s2, node)
if node.Left != nil {
s1 = append(s1, node.Left)
}
if node.Right != nil {
s1 = append(s1, node.Right)
}
}
for len(s2) > 0 {
res = append(res, s2[len(s2) -1].Val)
s2 = s2[:len(s2)-1]
}
return res
}Java 代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
// 黄哥Python培训 黄哥所写
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
stack1.push(root);
while (stack1.size() > 0) {
TreeNode node = stack1.pop();
stack2.push(node);
if (node != null) {
if (node.left != null) {
stack1.push(node.left);
}
if (node.right != null) {
stack1.push(node.right);
}
}
}
while (stack2.size() > 0) {
res.add(stack2.pop().val);
}
return res;
}
}