(学习java)二叉树的链式实现以及三种遍历方式

来源:互联网 发布:法制日报网络舆情内参 编辑:程序博客网 时间:2024/05/22 13:45
//二叉树的链表结构public class BinTree<T> {// 结点类class TreeNode {// 结点存储的数据Object data;// 结点左孩子TreeNode lchild;// 结点右孩子TreeNode rchild;public TreeNode() {}public TreeNode(Object data) {super();this.data = data;}}// 定义根结点private TreeNode root;public BinTree() {}public BinTree(T data) {this.root = new TreeNode(data);}// 添加结点 (isLeft是否添加在parent的左结点)public TreeNode addNode(TreeNode parent, T data, boolean isLeft) {if (parent == null) {throw new RuntimeException("父结点为空,无法添加子结点");} else if (isLeft && (parent.lchild != null)) {throw new RuntimeException("左孩子结点不为空,无法添加结点");} else if ((!isLeft) && (parent.rchild != null)) {throw new RuntimeException("右孩子结点不为空,无法添加结点");}TreeNode node = new TreeNode(data);if (isLeft) {parent.lchild = node;} else {parent.rchild = node;}return node;}// 返回双亲结点public TreeNode parent(TreeNode node) {// 根为空,或者结点就是根,返回空,否则返回该结点的双亲结点return (root == null || root == node) ? null : parent(root, node);}public TreeNode parent(TreeNode subTree, TreeNode node) {if (subTree == null) {return null;}// 如果subTree的左或者右孩子是node,则返回subTreeif (subTree.lchild == node || subTree.rchild == node) {return subTree;}// 如果不是,这依次遍历其左右子树,最终找到其双亲结点TreeNode p;if ((p = parent(subTree.lchild, node)) != null) {return p;} else {return parent(subTree.rchild, node);}}// 判断二叉树是否为空public boolean isEmpty() {if (root.data == null) {return true;} else {return false;}}// 获取根结点public TreeNode getRoot() {if (isEmpty()) {System.out.println("二叉树为空");return null;} else {return root;}}// 获取结点的左子树public TreeNode getLeft(TreeNode parent) {if (parent == null) {throw new RuntimeException("该结点为空,无法获取左子树");} else {return parent.lchild;}}// 获取结点的右子树public TreeNode getRight(TreeNode parent) {if (parent == null) {throw new RuntimeException("该结点为空,无法获取右子树");} else {return parent.rchild;}}private int getDeep(TreeNode node) {if (node == null) {return 0;} else {// 叶子结点,返回第一层if ((node.lchild == null) && (node.rchild) == null) {return 1;} else {// 求出左结点为叶子的结点时的最大深度int left = getDeep(node.lchild);// 求出右结点为叶子的结点时的最大深度int right = getDeep(node.rchild);// 取最大值为该结点的深度int max = (left > right) ? left : right;return max + 1;}}}// 求树的深度public int getTreeDeep() {return getDeep(root);}// 获取结点的个数public int size() {return size(root);}private int size(TreeNode node) {if (node == null) {return 0;} else {// 结点个数为,本身+左孩子结点数+右孩子结点数return 1 + size(node.lchild) + size(node.rchild);}}private void visit(TreeNode node) {System.out.print(node.data + " ");}// 遍历结点(前序遍历)public void preOrder(TreeNode node) {if (node != null) {visit(node);preOrder(node.lchild);preOrder(node.rchild);}}// 遍历结点(中序遍历)public void inOrder(TreeNode node) {if (node != null) {inOrder(node.lchild);visit(node);inOrder(node.rchild);}}// 遍历结点(后序遍历)public void postOrder(TreeNode node) {if (node != null) {postOrder(node.lchild);postOrder(node.rchild);visit(node);}}}

测试类

import mytree.BinTree.TreeNode;/* * 二叉树 * A *     B         C  * D       E  F * */public class BinTreeTest {public static void main(String[] args) {//定义一颗二叉树,根节点是ABinTree<Character> bt = new BinTree<Character>('A');TreeNode node1 = bt.addNode(bt.getRoot(), 'B', true);TreeNode node2 = bt.addNode(bt.getRoot(), 'C', false);TreeNode node3 = bt.addNode(node1, 'D', true);TreeNode node4 = bt.addNode(node1, 'E', false);TreeNode node5 = bt.addNode(node2, 'F', true);System.out.println("树的深度" + bt.getTreeDeep());System.out.println("树的总结点" + bt.size());System.out.print("前序遍历: ");bt.preOrder(bt.getRoot());System.out.println();System.out.print("中序遍历: ");bt.inOrder(bt.getRoot());System.out.println();System.out.print("后序遍历: ");bt.postOrder(bt.getRoot());}}


阅读全文
1 0