LeetCode 142: 二叉树的前序遍历 Binary Tree Preorder Traversal

题目:

给定一个二叉树,返回它的前序 遍历。

Given a binary tree, return the preorder traversal of its nodes' values.

示例:

输入: [1,null,2,3]
   1
    \
     2
    /
   3

输出: [1,3,2]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

Follow up: Recursive solution is trivial, could you do it iteratively?

解题思路:

遍历顺序:根节点 --> 左子节点 --> 右子节点

如下所示的二叉树:

A
     /   \
   B       C
 /  \     /  \
D    E   F    G

其遍历顺序为:A -> B -> D -> E -> C -> F -> G

类似 N 叉树那种, 两种思路: 递归和迭代, 很简单, 类似的题目可以参考:

树的遍历    Traverse a Tree

LeetCode 589: N 叉树的前序遍历    N-ary Tree Preorder Traversal

LeetCode 590: N 叉树的后序遍历    N-ary Tree Postorder Traversal

LeetCode 429: N 叉树的层序遍历    N-ary Tree Level Order Traversal

递归法:

Java:

class Solution {
    List<Integer> res =new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        preorderHelper(root);
        return res;
    }
    private void preorderHelper(TreeNode root){
        if(root==null)return; // 基线条件
        res.add(root.val);
        preorderHelper(root.left); // 递归左子树
        preorderHelper(root.right); // 递归右子树
    }
}

Python:

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res=[]
        def preorderHelper(root):
            if not root:return # 基线条件
            res.append(root.val)
            preorderHelper(root.left) # 递归左子树
            preorderHelper(root.right) # 递归右子树
        preorderHelper(root)
        return res

迭代法:

Java:

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();//数组
        if (root == null) return list;
        Stack<TreeNode> stack = new Stack<>();//用数据结构栈暂存节点
        TreeNode cur = root;//定义当前节点
        while (!stack.isEmpty() || cur != null) {//循环条件:栈不空或当前节点不空
            if (cur != null) {//当前节点不空时
                list.add(cur.val);//数组存入节点的值
                stack.push(cur);//当前节点入栈
                cur = cur.left;//刷新当前节点
            } else {//当前节点空时
                cur = stack.pop();//当前节点的父节点出栈
                cur = cur.right;//刷新当前节点
            }
        }
        return list;
    }
}

Python:

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        #初始化数组、栈
        res, stack = list(), list()
        #当前节点指向根节点
        cur = root
        #递归条件为:栈或当前节点非空
        while stack or cur:
            if cur: #当前节点非空时
                #其值存入数组
                res.append(cur.val)
                stack.append(cur)
                #刷新当前节点
                cur = cur.left
            else:
                #当前节点为空时其父节点出栈
                cur = stack.pop()
                #刷新当前节点
                cur =cur.right
        return res

11494c5b13d11723a1eb01dbb395f553.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值