【数据算法】Java实现二叉树存储以及遍历

二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作。

步骤就是原数据:数组

节点化数据:定义 Node节点对象

存储节点对象:通过LinkedList保存Node节点对象

在操作过程中我们需要将当前结点和前一节点、后一节点进行关系绑定

    package tree;  

    import java.util.LinkedList;
    import java.util.List;  

    /**
     * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历
     *
     * 参考资料0:数据结构(C语言版)严蔚敏
     *
     * 参考资料1:http://zhidao.baidu.com/question/81938912.html
     *
     * 参考资料2:http://cslibrary.stanford.edu/110/BinaryTrees.html#java
     *
     * @author [email protected] @date: 2011-5-17
     *
     */
    public class BinTreeTraverse2 {  

        private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        private static List<Node> nodeList = null;  

        /**
         * 内部类:节点
         *
         * @author [email protected] @date: 2011-5-17
         *
         */
        private static class Node {
            Node leftChild;
            Node rightChild;
            int data;  

            Node(int newData) {
                leftChild = null;
                rightChild = null;
                data = newData;
            }
        }  

        public void createBinTree() {
            nodeList = new LinkedList<Node>();
            // 将一个数组的值依次转换为Node节点
            for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
                nodeList.add(new Node(array[nodeIndex]));
            }
            // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
            for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
                // 左孩子
                nodeList.get(parentIndex).leftChild = nodeList
                        .get(parentIndex * 2 + 1);
                // 右孩子
                nodeList.get(parentIndex).rightChild = nodeList
                        .get(parentIndex * 2 + 2);
            }
            // 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
            int lastParentIndex = array.length / 2 - 1;
            // 左孩子
            nodeList.get(lastParentIndex).leftChild = nodeList
                    .get(lastParentIndex * 2 + 1);
            // 右孩子,如果数组的长度为奇数才建立右孩子
            if (array.length % 2 == 1) {
                nodeList.get(lastParentIndex).rightChild = nodeList
                        .get(lastParentIndex * 2 + 2);
            }
        }  

        /**
         * 先序遍历
         *
         * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
         *
         * @param node
         *            遍历的节点
         */
        public static void preOrderTraverse(Node node) {
            if (node == null)
                return;
            System.out.print(node.data + " ");
            preOrderTraverse(node.leftChild);
            preOrderTraverse(node.rightChild);
        }  

        /**
         * 中序遍历
         *
         * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
         *
         * @param node
         *            遍历的节点
         */
        public static void inOrderTraverse(Node node) {
            if (node == null)
                return;
            inOrderTraverse(node.leftChild);
            System.out.print(node.data + " ");
            inOrderTraverse(node.rightChild);
        }  

        /**
         * 后序遍历
         *
         * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
         *
         * @param node
         *            遍历的节点
         */
        public static void postOrderTraverse(Node node) {
            if (node == null)
                return;
            postOrderTraverse(node.leftChild);
            postOrderTraverse(node.rightChild);
            System.out.print(node.data + " ");
        }  

        public static void main(String[] args) {
            BinTreeTraverse2 binTree = new BinTreeTraverse2();
            binTree.createBinTree();
            // nodeList中第0个索引处的值即为根节点
            Node root = nodeList.get(0);  

            System.out.println("先序遍历:");
            preOrderTraverse(root);
            System.out.println();  

            System.out.println("中序遍历:");
            inOrderTraverse(root);
            System.out.println();  

            System.out.println("后序遍历:");
            postOrderTraverse(root);
        }  

    }
时间: 2025-01-02 16:35:57

【数据算法】Java实现二叉树存储以及遍历的相关文章

Java实现二叉树及相关遍历方式

Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 下面用Java实现对二叉树的先序遍历,中序遍历,后序遍历.广度优先遍历.深度优先遍历.转摘请注明:http://blog.csdn.net/qiuzhping/article/details/44830369 package com.qiuz

数据结构算法之图的存储与遍历(Java)

一:图的分类 1:无向图 即两个顶点之间没有明确的指向关系,只有一条边相连,例如,A顶点和B顶点之间可以表示为 <A, B> 也可以表示为<B, A>,如下所示 2:有向图 顶点之间是有方向性的,例如A和B顶点之间,A指向了B,B也指向了A,两者是不同的,如果给边赋予权重,那么这种异同便更加显著了 =============================================================================================

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利

【算法日常】二叉树的层级遍历

二叉树的层次遍历 题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal 题解: 本题有两种解法,首先第一种肯定是非常明显的广度优先遍历,另一种深度优先遍历的解法. 第一种: 广度优先遍历 广度优先遍历,将遍历的每层的结果放入一个列表中, 该层遍历结束,将整个结果列表加入到总的结果中即可.时间复杂度 O(n) 空间复杂度 O(1)(结果的存储空间若不进行计算的话) 代码如下: i

java创建二叉树并递归遍历二叉树

二叉树类代码: package binarytree; import linkqueue.LinkQueue; public class BinaryTree { class Node { public Object data; public Node lchild; public Node rchild; public Node(Object data) { this.data = data; this.lchild = null; this.rchild = null; } } //根节点

用java实现二叉树的遍历算法

用java实现二叉树的遍历算法用java实现二叉树的遍历算法,编写二叉树类BinaryTree代码如下:package package2; public class BinaryTree { int data; //根节点数据BinaryTree left; //左子树BinaryTree right; //右子树 public BinaryTree(int data) //实例化二叉树类{this.data = data;left = null;right = null;} public vo

【LeetCode-面试算法经典-Java实现】【094-Binary Tree Inorder Traversal(二叉树中序遍历)】

[094-Binary Tree Inorder Traversal(二叉树中序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the inorder traversal of its nodes' values. 题目大意 对一棵二叉树进行中序遍历. 解题思路 解法一:递归实现,解法二:迭代实现. 代码实现 二叉树结点类 public class TreeNode { int val; TreeNod

java实现二叉树及遍历、删除

java实现二叉树及遍历.删除 个人网站:多猫影视[可以看各大网站的VIP视频]www.duomao.xyz 二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——如图(a): (2)只有一个根结点的二叉树——如图(b): (3)只有左子树——如图(c): (4)只有右子树——如图(d): (5)完全二叉树——如图(e). 注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形.[1] 类型 (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉