二叉树的三叉链表存储(java实现)
2014-09-07 21:21
555 查看
package com.fcy.dataStruct; /** * 与二叉树的二叉链表存储相比,三叉链表存储 * 多了一个指针域来记录当前节点的父节点 */ class ThreeLinkBinTree<E>{ public static class TreeNode{ Object data; TreeNode left; //左子节点 TreeNode right; //右子节点 TreeNode parent; //父节点 public TreeNode(){ } public TreeNode(Object data){ this.data=data; } public TreeNode(Object data,TreeNode left,TreeNode right,TreeNode parent){ this.data=data; this.left=left; this.right=right; this.parent=parent; } } private TreeNode root; public ThreeLinkBinTree(){ this.root=new TreeNode(); } //以指定根元素来创建二叉树 public ThreeLinkBinTree(E data){ this.root=new TreeNode(data); } /** * 为指定节点添加子节点 * @param parent 新子节点的父节点 * @param data 新子节点的数据 * @param isLeft 是否为左子节点 * @return 新增的节点 */ public TreeNode addNode(TreeNode parent,E data,boolean isLeft){ if(parent==null){ throw new RuntimeException(parent+"节点为null,无法添加子节点"); } if(isLeft&&parent.left!=null){ throw new RuntimeException(parent+"节点已有左子节点,无法添加左子节点"); } if(!isLeft&&parent.right!=null){ throw new RuntimeException(parent+"节点已有右子节点,无法添加右子节点"); } TreeNode newNode=new TreeNode(data); if(isLeft){ //让父节点的left引用指向新节点 parent.left=newNode; }else{ //让父节点的right引用指向新节点 parent.right=newNode; } //让新节点的parent引用到parent节点 newNode.parent=parent; return newNode; } //判断二叉树是否为空 public boolean empty(){ return root.data==null; } //返回根节点 public TreeNode root(){ if(empty()){ throw new RuntimeException("树为空,无法访问根节点"); } return root; } //返回指定节点(非根节点)的父节点 public E parent(TreeNode node){ if(node==null){ throw new RuntimeException(node+"节点为Null,无法访问其父节点!"); } return (E)node.parent.data; } //返回指定节点(非叶子)的左子节点 public E leftChild(TreeNode parent){ if(parent==null){ throw new RuntimeException("节点为Null,无法添加子节点"); } return parent.left==null?null:(E)parent.left.data; } //返回指定节点(非叶子)的右子节点 public E rightChild(TreeNode parent){ if(parent==null){ throw new RuntimeException(parent+"节点为null,无法添加子节点"); } return parent.right==null?null:(E)parent.right.data; } //返回二叉树的深度 public int deep(){ return deep(root); } //递归,每棵子树的深度为其所有子树的最大深度+1 private int deep(TreeNode node){ if(node==null){ return 0; } //没有子树 if(node.left==null&&node.right==null){ return 1; }else{ int leftDeep=deep(node.left); int rightDeep=deep(node.right); //记录其所有左、右子树中较大的深度 int max=leftDeep>rightDeep?leftDeep:rightDeep; //返回其左、右子树中较大的深度+1 return max+1; } } } public class ThreeLinkBinDemo { public static void main(String[] args) { ThreeLinkBinTree<String> binTree=new ThreeLinkBinTree<>("根节点"); ThreeLinkBinTree.TreeNode tn1=binTree.addNode(binTree.root(),"第二层左节点",true); ThreeLinkBinTree.TreeNode tn2=binTree.addNode(binTree.root(),"第二层右节点",false); ThreeLinkBinTree.TreeNode tn3=binTree.addNode(tn2,"第三层左节点",true); ThreeLinkBinTree.TreeNode tn4=binTree.addNode(tn2,"第三层右节点",false); ThreeLinkBinTree.TreeNode tn5=binTree.addNode(tn3,"第四层左节点",true); System.out.println("tn2的左子节点:"+binTree.leftChild(tn2)); System.out.println("tn2的右子节点:"+binTree.rightChild(tn2)); System.out.println("tn3的父节点:"+binTree.parent(tn3)); System.out.println(binTree.deep()); } }
运行结果:
相关文章推荐
- 数据结构:二叉树的三叉链表存储--Java实现
- 二叉树的三叉链表存储及其Java实现
- 二叉树的顺序存储及其Java实现
- java实现二叉树的链式存储
- 二叉树的二叉链表存储及其Java实现
- Java基础 - 二叉树的三叉链表存储
- Java中二叉树存储结构实现
- 二叉树顺序存储(java实现)
- JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习
- 数据结构之---C语言实现二叉树的三叉链表存储表示
- JAVA实现二叉树(二叉树的存储、二叉树的遍历)
- 数据结构:二叉树的二叉链表存储--Java实现
- 二叉树的二叉链表存储(java实现)
- Java实现线性存储的二叉树
- 使用java实现链式存储的二叉树
- 二叉树的顺序存储和链式存储结构(java实现)
- Java实现链式存储的二叉树
- 二叉树的三叉链表存储结构的简单实现
- JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习
- 二叉树-链式存储-Java实现(未完待续)