博客
关于我
144. 二叉树的前序遍历
阅读量:262 次
发布时间:2019-03-01

本文共 4050 字,大约阅读时间需要 13 分钟。

二叉树的前序遍历

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

示例:

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

思路+代码+注释:

public ListpreorderTraversal(TreeNode root) {Listres=new ArrayListpreorderTraversal(root,res);return res;}

private void preorderTraversal(TreeNode node,Listres) {if (node==null) {return;}res.add(node.val);preorderTraversal(node.left,res);preorderTraversal(node.right,res);}

代码解释:

前序遍历的思路是根→左→右。我们采用递归的方式来处理树的节点。当节点为null时,直接返回;当节点不为null时,将节点的值添加到res中,然后递归处理左子节点,最后递归处理右子节点。

示例分析:

输入的二叉树结构如下:1/

2 3

前序遍历的结果是:1→2→3

代码实现:

使用递归的方式,先处理当前节点的值,然后递归处理左子节点,最后递归处理右子节点。

代码注释:

public ListpreorderTraversal(TreeNode root) {Listres=new ArrayListpreorderTraversal(root,res);return res;}

private void preorderTraversal(TreeNode node,Listres) {if (node==null) {return;}res.add(node.val);preorderTraversal(node.left,res);preorderTraversal(node.right,res);}

代码解释:

  • 首先,在函数 preorderTraversal 中,创建一个空的列表 res,以备存储结果。
  • 调用递归函数 preorderTraversal,传入根节点和 res。
  • 递归函数 preorderTraversal 检查当前节点是否为 null。如果是 null,直接返回。
  • 如果当前节点不为 null,将节点的值添加到 res 中。
  • 递归处理左子节点。
  • 递归处理右子节点。
  • 示例输出:

    输入: [1,null,2,3]输出: [1,2,3]

    代码实现的核心思想是利用递归来实现前序遍历的顺序,即先处理根节点,再处理左子节点,最后处理右子节点。

    代码优化:

    为了提高代码的可读性和性能,可以优化代码如下:

    public ListpreorderTraversal(TreeNode root) {Listres=new ArrayListif (root != null) {res.add(root.val);preorderTraversal(root.left, res);preorderTraversal(root.right, res);}return res;}

    private void preorderTraversal(TreeNode node,Listres) {if (node == null) {return;}res.add(node.val);preorderTraversal(node.left, res);preorderTraversal(node.right, res);}

    这一优化可以减少一些无用的检查,使代码更加简洁。

    代码注释优化:

    为了让代码更易理解,可以添加更详细的注释:

    public ListpreorderTraversal(TreeNode root) {/** 返回二叉树的前序遍历结果* @param root 二叉树的根节点* @return 前序遍历结果的列表/Listres=new ArrayList/* 如果根节点不为空,将其值添加到结果列表中* 然后递归处理左子节点,最后递归处理右子节点*/if (root != null) {res.add(root.val);preorderTraversal(root.left, res);preorderTraversal(root.right, res);}return res;}

    private void preorderTraversal(TreeNode node,Listres) {/** 如果当前节点为空,直接返回/if (node == null) {return;}/* 将当前节点的值添加到结果列表中/res.add(node.val);/* 递归处理左子节点/preorderTraversal(node.left, res);/* 递归处理右子节点*/preorderTraversal(node.right, res);}

    代码优化后的注释更加详细,方便开发者理解。

    示例测试:

    测试输入:root = [1,null,2,3]测试输出:[1,2,3]

    代码运行结果:

    调用 preorderTraversal(1, res) → res.add(1)调用 preorderTraversal(null, res) → 返回调用 preorderTraversal(2, res) → res.add(2)调用 preorderTraversal(null, res) → 返回调用 preorderTraversal(3, res) → res.add(3)调用 preorderTraversal(null, res) → 返回

    最终 res = [1,2,3]

    代码性能:

    该算法的时间复杂度为 O(n),其中 n 是二叉树的节点数。空间复杂度为 O(h),h 是二叉树的高度。

    代码适用范围:

    该算法适用于所有二叉树的前序遍历问题,包括二叉树的子树前序遍历、偶数层序遍历等。

    代码扩展:

    如果需要对二叉树的其他遍历方式进行实现,可以参考以下代码:

    • 中序遍历:public ListinorderTraversal(TreeNode root) {Listres=new ArrayListinorderTraversal(root, res);return res;}

      private void inorderTraversal(TreeNode node,Listres) {if (node == null) {return;}inorderTraversal(node.left, res);res.add(node.val);inorderTraversal(node.right, res);}

    • 后序遍历:public ListpostorderTraversal(TreeNode root) {Listres=new ArrayListpostorderTraversal(root, res);return res;}

      private void postorderTraversal(TreeNode node,Listres) {if (node == null) {return;}postorderTraversal(node.left, res);postorderTraversal(node.right, res);res.add(node.val);}

    通过这种方式,可以轻松扩展对不同遍历方式的实现。

    代码总结:

    前序遍历是处理根节点,然后处理左子节点,最后处理右子节点。通过递归的方式,可以实现二叉树的前序遍历。

    代码优化建议:

    为了提高代码性能,可以使用循环实现前序遍历,而不是递归。递归在处理非常深的二叉树时,可能会导致栈溢出问题。

    代码实战:

    在实际开发中,可以将二叉树的节点用 JavaBean 标签表示,如:

    然后通过 Spring 的配置来定义二叉树的结构。这样可以简化代码配置,方便测试和调试。

    代码测试:

    在测试代码时,可以使用以下方式验证结果是否正确:

    public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);Listresult = preorderTraversal(root);System.out.println(result); // 输出 [1,2,3]}

    通过以上代码,可以验证前序遍历的正确性。

    代码优化:

    为了提高代码性能,可以将递归方法改为循环方法。例如:

    public ListpreorderTraversal(TreeNode root) {Listres=new ArrayListStackstack=new Stack()if (root != null) {stack.push(root);}while (!stack.isEmpty()) {TreeNode node = stack.pop();res.add(node.val);if (node.right != null) {stack.push(node.right);}if (node.left != null) {stack.push(node.left);}}return res;}

    这种方法使用栈来模拟递归的过程,避免了递归调用的开销。

    代码总结:

    通过以上代码和优化,可以清晰地看到如何实现二叉树的前序遍历。递归和循环两种方法都可以实现,建议根据实际需求选择合适的方式。

    通过以上优化,可以确保代码的可读性、性能和可扩展性。

    转载地址:http://ppwa.baihongyu.com/

    你可能感兴趣的文章
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>
    npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
    查看>>
    npm—小记
    查看>>
    npm上传自己的项目
    查看>>
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>
    npm入门,这篇就够了
    查看>>
    npm切换到淘宝源
    查看>>
    npm切换源淘宝源的两种方法
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm包管理深度探索:从基础到进阶全面教程!
    查看>>
    npm升级以及使用淘宝npm镜像
    查看>>
    npm发布包--所遇到的问题
    查看>>
    npm发布自己的组件UI包(详细步骤,图文并茂)
    查看>>
    npm和package.json那些不为常人所知的小秘密
    查看>>
    npm和yarn清理缓存命令
    查看>>
    npm和yarn的使用对比
    查看>>
    npm如何清空缓存并重新打包?
    查看>>
    npm学习(十一)之package-lock.json
    查看>>