二叉树创建 前序 中序 后序遍历 Java版本

本文详细介绍了如何通过递归实现二叉树的创建,包括节点定义与构造,以及前序、中序和后序遍历的算法。通过实例演示了如何将整数数组转化为二叉树并进行遍历操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树概念

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分 [1] 。

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点

二叉树非递归遍历基于栈和队列深度与广度遍历

tips : 本篇主要围绕二叉树的创建与递归遍历展开学习 未涉及概念性的知识

预览
  1. 三步创建二叉树
  2. 二叉树创建过程图解
  3. 二叉树遍历图解与实现代码
三步创建二叉树
创建树节点
public class MyTreeNode {

    // 树的值
    private Integer num;
    // 左子树
    private MyTreeNode leftNode;
    // 右子树
    private MyTreeNode rightNode;

    public MyTreeNode(Integer num) {
        this.num = num;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public MyTreeNode getLeftNode() {
        return leftNode;
    }

    public void setLeftNode(MyTreeNode leftNode) {
        this.leftNode = leftNode;
    }

    public MyTreeNode getRightNode() {
        return rightNode;
    }

    public void setRightNode(MyTreeNode rightNode) {
        this.rightNode = rightNode;
    }

    @Override
    public String toString() {
        return "MyTreeNode{" +
                "num=" + num +
                ", leftNode=" + leftNode +
                ", rightNode=" + rightNode +
                '}';
    }
}
创建树
package binary_tree;

public class BinaryTree {
    // 根节点
    private MyTreeNode rootNode;

    public MyTreeNode getRootNode() {
        return rootNode;
    }

    public void setRootNode(MyTreeNode rootNode) {
        this.rootNode = rootNode;
    }

    @Override
    public String toString() {
        return "BinaryTree{" +
                "rootNode=" + rootNode +
                '}';
    }
}

创建测试类与二叉树插值的方法
public class MyTest_Tree {
    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(15, 20, 12, 30, 28, 54, 29,27,26, 1);

        // 将list转换为二叉树
        BinaryTree tree = new BinaryTree();
        list.forEach(x -> insert(x, tree))
    }
    
    // 二叉树插入值
    public static void insert(Integer num, BinaryTree tree) {

        if (tree == null || num == null) return;
        // 获取根节点
        MyTreeNode rootNode = tree.getRootNode();
        if (rootNode == null) {
            tree.setRootNode(new MyTreeNode(num));
            return;
        }

        //生成子节点
        MyTreeNode tempNode = rootNode;
        while (tempNode != null) {
            // 相同值跳出
            if (num == tempNode.getNum()) break;
            // 往左边插入
            if (tempNode.getNum() > num) {
                if (tempNode.getLeftNode() == null) {
                    tempNode.setLeftNode(new MyTreeNode(num));
                    break;
                }
                tempNode = tempNode.getLeftNode();
            }
            // 往右边插入
            if (tempNode.getNum() < num) {
                if (tempNode.getRightNode() == null) {
                    tempNode.setRightNode(new MyTreeNode(num));
                    break;
                }
                tempNode = tempNode.getRightNode();
            }

        }

    }
    
}
至此 二叉树创建完毕 根据上面的插值方法 生成的二叉树如下

在这里插入图片描述

生成树的步骤如下
  1. 取出数组中的第一个元素15 将其设置为根节点

  2. 依次取出数组中的第二个元素 20 此时20 大于根节点的15 将其放到15的右子树节点

  3. 取出第三个元素12 12小于根节点的20 将其置为15的左子树

  4. 取出第四个元素30 30大于根节点的15 将其放置右子树 此时右子树已经存在20 30需要依次比较

    此时30大于20 将其放置20的右子树

  5. 剩余数据依次如图所示…

二叉树生成过程

二叉树遍历

目前二叉树遍历的主要几种方式分别为递归、基于栈、基于队列进行遍历。本篇主要提供集中递归遍历的思路。

前序遍历

前序遍历的主要顺序为 左 根 右

基于上图最终生成的树而言 前序输出的结果应为 1 12 15 20 26 27 28 29 30 54

先序遍历

    public static void before(MyTreeNode tree) {
        if (tree == null || tree.getNum() == null) return;
        mid(tree.getLeftNode()); //
        System.out.println(tree.getNum());
        mid(tree.getRightNode());
    }
中序遍历

中序遍历主要顺序为 根 左 右

基于上图最终生成的树而言 中序输出的结果应为 15 12 1 20 30 28 27 26 29 54

中序遍历

public static void mid(MyTreeNode tree) {
        if (tree == null || tree.getNum() == null) return;
        System.out.println(tree.getNum());
        mid(tree.getLeftNode());
        mid(tree.getRightNode());
    }
后序遍历

后序遍历的顺序为 左 右 根

基于上图最终生成的树而言 后序输出的结果应为 1 12 26 27 29 28 54 30 20 15
后序遍历

    public static void after(MyTreeNode tree) {
        if (tree == null || tree.getNum() == null) return;
        after(tree.getLeftNode());
        after(tree.getRightNode());
        System.out.println(tree.getNum());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值