链式二叉树的遍历Java版

来源:互联网 发布:微信点赞软件免费 编辑:程序博客网 时间:2024/06/14 10:18
package dataStructure;import java.util.ArrayList;import java.util.List;/** *COPYRIGHT (C) 2017 BY HOKI SOFTWARE. ALL RIGHTS RESERVED. *VERSION:v1.0 *AUTHOR:Hoki_Lin  *DATE:2017年12月5日 *DESCRIPTION:链式二叉树遍历 */public class BiTreeByLinked {private Node root;//根节点private List<Node> list = new ArrayList<Node>();//泛型是Node//利用构造方法实现树的初始化public BiTreeByLinked() {init();}// 树的初始化:先从叶节点开始,由叶到根public void init() {Node x = new Node("X", null, null);Node y = new Node("Y", null, null);Node d = new Node("d", x, y);Node e = new Node("e", null, null);Node f = new Node("f", null, null);Node c = new Node("c", e, f);Node b = new Node("b", d, null);Node a = new Node("a", b, c);root = a;}// 内部类:节点类;相当于C里的自定义数据类型private class Node {private String data;private Node lchild;// 定义指向左子树的指针private Node rchild;// 定义指向右子树的指针public Node(String data, Node lchild, Node rchild) {this.data = data;this.lchild = lchild;this.rchild = rchild;}}/** * 对该二叉树进行前序遍历 结果存储到list中  *  * @param node */public void preOrder(Node node) {list.add(node); // 先将根节点存入listif (node.lchild != null) {preOrder(node.lchild);}if (node.rchild != null) {preOrder(node.rchild);}}/** * 对该二叉树进行中序遍历 结果存储到list中 *  * @param node */public void inOrder(Node node) {if (node.lchild != null) {inOrder(node.lchild);}list.add(node);if (node.rchild != null) {inOrder(node.rchild);}}/** * 对该二叉树进行后序遍历 结果存储到list中 *  * @param node */public void postOrder(Node node) {if (node.lchild != null) {postOrder(node.lchild);}if (node.rchild != null) {postOrder(node.rchild);}list.add(node);}/** * 返回树的深度  * 说明:  * 1、如果一棵树只有一个结点,它的深度为1。  * 2、如果根结点只有左子树而没有右子树,那么树的深度是其左子树的深度加1; * 3、如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1; * 4、如果既有右子树又有左子树,那该树的深度就是其左、右子树深度的较大值再加1。 *  * @return TreeDepth */public int getTreeDepth(Node node) {if (node.lchild == null && node.rchild == null) {return 1;}int left = 0, right = 0;if (node.lchild != null) {left = getTreeDepth(node.lchild);}if (node.rchild != null) {right = getTreeDepth(node.rchild);}return left > right ? left + 1 : right + 1;}/** * 得到遍历结果集 *  * @return */public List<Node> getResultList() {return list;}/** * 主方法进行测试 *  * @param args */public static void main(String[] args) {BiTreeByLinked tree = new BiTreeByLinked();System.out.println("根节点是:" + tree.root.data);System.out.println("后序遍历结果:");tree.postOrder(tree.root);for (Node node : tree.getResultList()) {System.out.print(node.data+" ");}System.out.println("树的深度是" + tree.getTreeDepth(tree.root));//如果上次debug调试的代码有错,导致进程没有终止,占用了Console输出,再次启动调试会报错//添加System.exit(0);可以在程序结束时立即退出//System.exit(0);}}


原创粉丝点击