二叉树的三叉链表存储(java实现)

来源:互联网 发布:sql数据库获取当前时间 编辑:程序博客网 时间:2024/05/16 02:12
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);}//递归,每棵子树的深度为其所有子树的最大深度+1private 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;//返回其左、右子树中较大的深度+1return 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());}} 


运行结果:





0 0
原创粉丝点击