二叉树的二叉链表存储(java实现)
2014-09-07 21:09
513 查看
package com.fcy.dataStruct; /** * 二叉树的二叉链表存储的是数据域、左子节点和右子节点 */ class TwoLinkBinTree<E>{ public static class TreeNode{ //数据域 Object data; //左子节点 TreeNode left; //右子节点 TreeNode right; public TreeNode(){ } public TreeNode(Object data){ this.data=data; } public TreeNode(Object data,TreeNode left,TreeNode right){ this.data=data; this.left=left; this.right=right; } } private TreeNode root; public TwoLinkBinTree(){ this.root=new TreeNode(); } //以指定根元素来创建二叉树 public TwoLinkBinTree(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; } 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("节点为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 TwoLinkBinaryTreeDemo { public static void main(String[] args) { TwoLinkBinTree<String> binTree=new TwoLinkBinTree<>("根节点"); TwoLinkBinTree.TreeNode tn1=binTree.addNode(binTree.root(),"第二层左节点",true); TwoLinkBinTree.TreeNode tn2=binTree.addNode(binTree.root(),"第二层右节点",false); TwoLinkBinTree.TreeNode tn3=binTree.addNode(tn2,"第三层左节点",true); TwoLinkBinTree.TreeNode tn4=binTree.addNode(tn2,"第三层左节点",false); TwoLinkBinTree.TreeNode tn5=binTree.addNode(tn3,"第四层左节点",true); System.out.println("tn2的左子节点:"+binTree.leftChild(tn2)); System.out.println("tn2的右子节点:"+binTree.rightChild(tn2)); System.out.println(binTree.deep()); } }
运行结果:
相关文章推荐
- 二叉树的二叉链表存储及其Java实现
- 数据结构:二叉树的三叉链表存储--Java实现
- 二叉树的三叉链表存储(java实现)
- Java中二叉树存储结构实现
- 二叉树的顺序存储及其Java实现
- JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习
- 使用java实现顺序存储的二叉树
- Java基础 - 二叉树的二叉链表存储
- 二叉树的三叉链表存储及其Java实现
- 二叉树(二叉链表实现)JAVA代码
- 二叉树的二叉链表存储简单实现
- 使用java实现链式存储的二叉树
- 二叉树-链式存储-Java实现(未完待续)
- 二叉树顺序存储(java实现)
- Java实现链式存储的二叉树
- Java实现线性存储的二叉树
- JAVA实现二叉树(二叉树的存储、二叉树的遍历)
- c语言实现二叉树的基本操作--二叉链表存储
- 二叉树的顺序存储实现(Java)
- 数据结构之---C语言实现二叉树的二叉链表存储表示