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

yizhihongxing

下面是针对“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日

相关文章

  • linux btrfs文件系统及管理

    Linux Btrfs文件系统及管理攻略 什么是Btrfs文件系统? Btrfs是一个先进的复制文件系统,可以提供高容错性、数据集成、压缩和快照等功能。Btrfs文件系统还可以进行在线数据恢复和磁盘故障检测与修复。 如何安装Btrfs Btrfs作为Linux的核心文件系统,通常在大多数Linux发行版上默认安装。如果您需要安装,可以使用以下命令来检查是否安…

    other 2023年6月27日
    00
  • PowerShell ISE中代码转换大小写的技巧

    PowerShell ISE中代码转换大小写的技巧攻略 在PowerShell ISE中,你可以使用一些技巧来转换代码的大小写。下面是一些示例说明: 1. 使用ToUpper()和ToLower()方法 你可以使用ToUpper()和ToLower()方法来将代码转换为大写或小写。下面是一个示例: # 原始代码 $myString = \"Hell…

    other 2023年8月17日
    00
  • webpack教程之webpack.config.js配置文件

    下面我将就webpack.config.js的配置文件作为主题,为您提供一份完整的攻略。 什么是webpack.config.js文件? webpack.config.js文件是Webpack的主要配置文件,它描述了整个Webpack项目的构建过程。配置文件中包含了Webpack的入口文件、出口文件、模块解析等等一系列的配置选项。我们可以通过更改这些选项,来…

    other 2023年6月25日
    00
  • webpackhmr

    Webpack HMR的完整攻略 Webpack HMR(Hot Module Replacement)是Webpack提供的一种热更新机制,可以在不刷新页面的情况下更新模块。以下是Webpack HMR的完整攻略,包含两个示例说明。 步骤一:安装Webpack和Webpack Dev Server 在使用Webpack HMR之前,您需要安装Webpack…

    other 2023年5月9日
    00
  • Python构造函数与析构函数超详细分析

    Python构造函数与析构函数超详细分析 构造函数 构造函数是一种特殊类型的函数,在创建一个类的实例时进行初始化,通常用来给类的属性赋初始值。 在 Python 中,构造函数是 __init__ 方法。它的语法为: def __init__(self[, arg1, arg2…]): # 初始化代码 self 表示类的实例对象。 arg1, arg2..…

    other 2023年6月26日
    00
  • 字符串拼接的批处理

    下面是关于“字符串拼接的批处理”的完整攻略。 什么是字符串拼接的批处理? 字符串拼接的批处理是指将多个字符串连接成一个或多个长字符串的操作,该操作通常在Windows批处理或CMD(命令提示符)环境中使用。字符串拼接的批处理通常使用“set”命令与“+”运算符组合来实现。 字符串拼接的基本语法 下面是基本的字符串拼接语法: set string1=这是第一个…

    other 2023年6月20日
    00
  • easypoi教程和使用案例

    以下是关于“easypoi教程和使用案例”的完整攻略: Easypoi简介 Easypoi是一款基于POI和Jxls的Java Excel工具,可以快速、简单地实现Excel入导出功能。Easypoi支持Excel模板导出、Excel模板导入、Excel导出、Excel导入等多种功能。 Easypoi教程 以下是一些学习Easypoi的资料和示例: Easy…

    other 2023年5月9日
    00
  • 访问IIS元数据库失败的解决方法

    访问IIS元数据库失败的解决方法 IIS(Internet Information Services)是微软公司开发的一款Web服务器软件,用于托管和管理Web应用程序。在使用IIS时,有时会遇到访问IIS元数据库失败的问题,这可能会导致IIS无法正常工作。本文将介绍如何解决访问IIS元数据库失败的问题。 问题描述 在使用IIS时,有时会遇到以下错误信息: …

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