个人感觉二叉树的实现主要还是如何构造一颗二叉树。构造二叉树函数的设计方法多种多样。以下程序通过定义内部类来表示二叉树的结点,然后再实现了二叉树这种数据结构的一些基本操作。
package tree; public class BinaryTree<E> { //为什么要用静态内部类?静态内部类中不能访问外部类的非静态成员 public static class TreeNode{ // E data; Object data; TreeNode left; TreeNode right; public TreeNode(){ } public TreeNode(Object data){ this.data = data; } //构造一个新节点,该节点以left节点为其左孩子,right节点为其右孩子 public TreeNode(Object data, TreeNode left, TreeNode right){ this.data = data; this.left = left; this.right = right; } } private TreeNode root;//实现二叉树的类的数据域,即根结点来表示二叉树 public BinaryTree(){ this.root = new TreeNode(); } //以指定的根元素创建一颗二叉树 public BinaryTree(E data){ this.root = new TreeNode(data); } //为指定的结点添加子结点 public TreeNode addNode(TreeNode parent, E data, boolean isLeft){ if(parent == null) throw new RuntimeException("父节点为空,无法添加子结点"); if(isLeft && parent.left != null) throw new RuntimeException("节点已经左子节点,添加失败"); if(!isLeft && parent.right != null) throw new RuntimeException("节点已经有右子节点,添加失败"); TreeNode newNode = new TreeNode(data); if(isLeft) parent.left = newNode; else parent.right = newNode; return newNode; } public boolean empty(){ return root.data == null;//根据根元素判断二叉树是否为空 } public TreeNode root(){ if(empty()) throw new RuntimeException("树空,无法访问根结点"); return root; } public E parent(TreeNode node){ return null;//采用二叉树链表存储时,访问父结点需要遍历整棵二叉树,因为这里不实现 } //访问指定节点的左结点,返回的是其左孩子的数据域 public E leftChild(TreeNode parent){ if(parent == null) throw new RuntimeException("空结点不能访问其左孩子"); return parent.left == null ? null : (E)parent.left.data; } public E rightChild(TreeNode parent){ if(parent == null) throw new RuntimeException("空结点不能访问其右孩子"); return parent.right == null ? null : (E)parent.right.data; } public int deep(){ return deep(root); } private int deep(TreeNode node){ if(node == null) return 0; else{ int leftDeep = deep(node.left); int rightDeep = deep(node.right); int max = leftDeep > rightDeep ? leftDeep : rightDeep; return max + 1; } } }
时间: 2025-01-07 02:28:54