Java实现二叉树的示例代码(递归&迭代)

下面是针对“Java实现二叉树的示例代码(递归&迭代)”的完整攻略:

什么是二叉树?

二叉树(binary tree)是一种非常常用的数据结构,在计算机科学的领域中被广泛使用。它采用了树形结构,每个结点最多有两个子节点:一个左子节点和一个右子节点。以根节点为起点,不断递归地对子节点进行处理,可以有效地管理数据和信息。

递归实现二叉树

递归是一种非常常用的编程思想,在二叉树的设计中,也有其独特的应用。下面我们就来看看一个经典的例子,如何使用递归实现二叉树的设计:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class BinaryTree {
    public TreeNode construct(int[] preorder, int[] inorder) {
        if (preorder == null || preorder.length == 0) {
            return null;
        }
        return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
    }

    private TreeNode helper(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {
        if (preStart > preEnd || inStart > inEnd) {
            return null;
        }
        int rootVal = preorder[preStart];
        TreeNode root = new TreeNode(rootVal);
        int inorderIndex = 0;
        for (int i = inStart; i <= inEnd; i++) {
            if (inorder[i] == rootVal) {
                inorderIndex = i;
                break;
            }
        }
        int leftSubtreeSize = inorderIndex - inStart;
        root.left = helper(preorder, preStart + 1, preStart + leftSubtreeSize, inorder, inStart, inorderIndex - 1);
        root.right = helper(preorder, preStart + leftSubtreeSize + 1, preEnd, inorder, inorderIndex + 1, inEnd);
        return root;
    }
}

我们可以看到,在递归实现函数中,首先判断前序遍历序列中是否有值。如果没有值,则直接返回null。接着,需要对当前的根节点进行初始化。

然后,根据前序遍历序列的特点,可以找到该根节点对应的中序遍历序列中的位置。这样我们就可以确定所有的左子树节点和右子树节点,从而进行递归地处理整个二叉树。

迭代实现二叉树

迭代是另一种常用的编程思想,在二叉树的设计中,它同样有非常的应用。下面我们来看看一个经典的例子,如何使用迭代实现二叉树的设计:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class BinaryTree {
    public TreeNode construct(int[] preorder, int[] inorder) {
        if (preorder == null || preorder.length == 0) {
            return null;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode root = new TreeNode(preorder[0]);
        stack.push(root);
        for (int i = 1, j = 0; i < preorder.length; i++) {
            TreeNode node = new TreeNode(preorder[i]);
            TreeNode cur = stack.peek();
            if (cur.val != inorder[j]) {
                cur.left = node;
            } else {
                while (!stack.isEmpty() && stack.peek().val == inorder[j]) {
                    cur = stack.pop();
                    j++;
                }
                cur.right = node;
            }
            stack.push(node);
        }
        return root;
    }
}

我们可以看到,在迭代实现函数中,首先判断前序遍历序列中是否有值。如果没有值,则直接返回null。接着使用stack作为辅助容器,来存储整个二叉树的结点。首先,我们需要初始化根节点,然后对所有的结点进行循环,依次判断当前节点是否是左子节点或者右子节点。

如果是左子节点,则需要将此节点与前面的节点挂接上,同时将此节点入栈。如果是右子节点,则需要对所有的前面的节点进行出栈,直到找到一个节点,左子树被处理完毕,右子树尚未处理。此时,将此节点与当前节点挂接上,并将散入的所有右子节点入栈。

通过这样的方式,我们就可以使用迭代实现二叉树的相关功能了。

示例说明

  1. 递归示例

假设有如下二叉树:

           1
        /    \
       2      4
     /   \   /  \
    3    5  7   9

则先序遍历序列为:1 2 3 5 4 7 9

中序遍历序列为:3 2 5 1 7 4 9

使用递归方式,可以将此二叉树表示为以下结构:

         1
       /   \
      2     4
     / \   / \
    3   5 7   9
  1. 迭代示例

假设有如下二叉树:

           1
        /    \
       2      4
     /   \   /  \
    3    5  7   9

则先序遍历序列为:1 2 3 5 4 7 9

中序遍历序列为:3 2 5 1 7 4 9

使用迭代方式,可以将此二叉树表示为以下结构:

         1
       /   \
      2     4
     / \   / \
    3   5 7   9

通过以上两个示例,我们可以看到,在递归和迭代的方式下,无论是数据量还是性能,都没有明显的差异。使用递归和迭代方式,开发者可以根据项目的需求来决定使用何种编程思想。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现二叉树的示例代码(递归&迭代) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 利用腾讯的ip地址库做ip物理地址定位

    利用腾讯的IP地址库做IP物理地址定位攻略 1. 获取腾讯IP地址库 首先,我们需要获取腾讯的IP地址库,该库包含了大量IP地址与物理地址的映射关系。腾讯提供了免费的IP地址库查询接口,我们可以通过发送HTTP请求来获取数据。 示例代码如下: import requests # 发送HTTP请求获取IP地址库数据 response = requests.ge…

    other 2023年7月30日
    00
  • velocitytracker滑动速度**简介

    VelocityTracker是Android中的一个类,用于跟踪触摸事件的速度。以下是VelocityTracker滑动速度的详细攻略: 创建VelocityTracker对象 在使用VelocityTracker之前,需要创建Velocity对象。可以使用以下代码创建VelocityTracker对象: VelocityTracker velocityT…

    other 2023年5月8日
    00
  • 让电脑关机时自动清理虚拟内存页面文件的方法

    让电脑关机时自动清理虚拟内存页面文件的方法攻略 在Windows操作系统中,可以通过以下步骤让电脑在关机时自动清理虚拟内存页面文件: 打开“开始”菜单,点击“运行”(或按下Win + R键),输入“regedit”并按下回车键,打开注册表编辑器。 在注册表编辑器中,导航到以下路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro…

    other 2023年8月1日
    00
  • 解决Spring AOP拦截抽象类(父类)中方法失效问题

    要解决Spring AOP拦截抽象类(父类)中方法失效问题,我们需要在拦截器中使用一个aspectj工具方法来处理。下面是具体的攻略: 1. 继承AbstractAutoProxyCreator类 在Spring中,我们通常使用AbstractAutoProxyCreator类作为自动代理创建器,所以我们需要继承它。重写其中的postProcessAfter…

    other 2023年6月27日
    00
  • iPhone老是自动重启怎么办?苹果手机自动重启的解决方法

    iPhone老是自动重启怎么办?苹果手机自动重启的解决方法 问题描述 有些iPhone用户可能会遇到一个问题,那就是iPhone老是自动重启,这个问题非常的困扰,因为无法正常使用手机,而且也会导致数据的丢失。那么这个问题该如何解决呢? 解决方法 下面是一些可能的解决方法,你可以根据自己的情况进行尝试。 方法一:更新iOS系统 有时候iPhone系统存在一些b…

    other 2023年6月26日
    00
  • c++-在c++中将char转换为int

    在C++中将char类型转换为int类型的方法有多种,下面是两种常用的方法: 方法1:使用强制类型转换 可以使用强制类型转换将char类型转换为int。例如: char c = ‘a’; int i = (int)c; 在上面的示例中,将字符’a’赋值给变量c,然后使用强制类型转换将c转换为int类型,并将结果赋值给变量i。 方法2:使用ASCII码 在C+…

    other 2023年5月7日
    00
  • 实验十一 团队作业7—团队项目设计完善&编码测试

    实验十一 团队作业7—团队项目设计完善&编码测试 本篇文章旨在介绍实验十一团队作业7的团队项目设计完善和编码测试过程。在团队合作中,团队成员需要协调合作,互相配合,做好项目设计细节和编码测试工作,这样才能保证项目的顺利推进和高质量的交付。 项目设计完善 在项目设计完善阶段,团队成员需要对前期的项目设计进行细化和完善。具体的完善内容包括但不限于: …

    其他 2023年3月28日
    00
  • .Net创建型设计模式之原型模式(Prototype)

    .NET创建型设计模式之原型模式(Prototype) 原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需依赖于显式的构造函数或工厂方法。这种模式可以提供一种更高效、更灵活的对象创建方式。 实现原型模式的步骤 以下是实现原型模式的一般步骤: 创建一个可复制的原型接口或抽象类,该接口或抽象类定义了复制自身的方法。 在具体原型类中实现原型接…

    other 2023年10月15日
    00
合作推广
合作推广
分享本页
返回顶部