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

129 阅读1分钟
原文链接: zhuanlan.zhihu.com

LeetCode 144题 Binary Tree Preorder Traversal

1、读题,题目是二叉树的Preorder Traversal (先序遍历),如果是递归几行代码就可以解决。题目建议用循环去解决。(Follow up:Recursive solution is trivial, could you do it iteratively?)

2、dfs 遍历都是用栈,利用栈的后进先出的特性,这个题目关键点,要先添加右子树,再添加左子树。

3、看黄哥Python、Go、Java 三种语言写的代码。

Python 代码

# 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 preorderTraversal(self, root: TreeNode) -> List[int]:
        if root is None:
            return []
        stack = [root]
        res = []
        while stack:
            node = stack.pop()
            if node:
                res.append(node.val)
                if node.right is not None:
                    stack.append(node.right)
                if node.left is not None:
                    stack.append(node.left)
        return res

Go 代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
// 黄哥Python培训 黄哥所写
func preorderTraversal(root *TreeNode) []int {
    var res []int
    if root == nil {
        return res
    }
    stack := []*TreeNode{root}
    for len(stack) > 0 {
        node := stack[len(stack) - 1]
        stack = stack[0: len(stack) - 1]
        if node != nil {
            res = append(res, node.Val)
        }
        
        if node.Right != nil {
            stack = append(stack, node.Right)
        }
        if node.Left != nil {
            stack = append(stack, node.Left)
        }
    }
    return res
}

Java 代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.Stack;
// 黄哥Python培训 黄哥所写
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        
        while (stack.size() > 0) {
            TreeNode node = stack.pop();
            if (node != null) {
                res.add(node.val);
                if (node.right != null) {
                     stack.push(node.right);
                }
                if (node.left != null) {
                     stack.push(node.left);
                }
            }
        }
        return res;
            
    }
}


黄哥:黄哥Python:提醒要转行当程序员的朋友,学习要分先后主次zhuanlan.zhihu.com图标黄哥:黄哥Python培训是这样训练学员的zhuanlan.zhihu.com图标


请看