黄哥Python: Binary Tree Postorder Traversal 解题思路

288 阅读2分钟
原文链接: zhuanlan.zhihu.com

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 res

2、循环后序遍历,黄哥用了一个稍微简单的一点的方法,使用二个栈 + 先添加左子树的方法。 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 res

Go 代码

/**
 * 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; 
    }
}
黄哥:黄哥Python:提醒要转行当程序员的朋友,学习要分先后主次zhuanlan.zhihu.com图标黄哥:黄哥Python培训是这样训练学员的zhuanlan.zhihu.com图标