zoukankan      html  css  js  c++  java
  • 三种方式遍历一颗二叉树

    package com.example.demo;
    
    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
     *
     */
    public class BinTree {
    
        private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        private static List<Node> nodeList = null;
    
        /**
         * 内部类:节点
         *
         */
        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) {
            BinTree binTree = new BinTree();
            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);
        }
    
    }
    

      

  • 相关阅读:
    Linux基础巩固--Day4--文本处理
    Linux基础巩固--Day3--用户组及权限操作
    2020撸python--argparse列出D盘目录详情
    2020撸python--socket编程
    Linux基础巩固--Day2--文件操作
    Linux基础巩固--Day1--背景介绍
    Let's Go -- 初始go语言
    ValueError: Related model 'users.UserProfile' cannot be resolved
    半虚拟化驱动virtio-Windows
    virt-install 创建虚拟机
  • 原文地址:https://www.cnblogs.com/qianjinyan/p/11152306.html
Copyright © 2011-2022 走看看