• java实现二叉树的构建以及3种遍历方法


    目录: 

    1.把一个数组的值赋值给一颗二叉树 

    2.具体代码 


    1.树的构建方法 

    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 ocaicai@yeah.net @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 ocaicai@yeah.net @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);
    }

    }

    先序遍历:
    1 2 4 8 9 5 3 6 7
    中序遍历:
    8 4 9 2 5 1 6 3 7
    后序遍历:
    8 9 4 5 2 6 7 3 1

  • 相关阅读:
    SpringBoot+Vue+HIKVSION实现摄像头多选并多窗口预览(插件版)
    Vue+Video.js播放m3u8视频流(海康威视摄像头+RTMP服务+FFmpeg)
    Vue+Openlayers中实现地图旋转
    Vue中实现检测当前是否为IE模式(极速模式还是兼容模式)
    Vue+Openlayer使用overlay实现弹窗弹出显示与关闭
    Vue+Openlayers实现显示图片并分优先级多图层加载
    Vue+Openlayer使用Draw实现交互式绘制线段
    ActionScriopt 产生随机颜色
    在AS3中格式化日期
    ArcGis For Flex 之 QueryTask地理坐标展现【原创】
  • 原文地址:https://www.cnblogs.com/liangjq/p/3996589.html
Copyright © 2020-2023  润新知