二叉树的三叉链表存储(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
- 二叉树的三叉链表存储(java实现)
- 数据结构:二叉树的三叉链表存储--Java实现
- 二叉树的三叉链表存储及其Java实现
- 二叉树的三叉链表存储及其Java实现
- Java基础 - 二叉树的三叉链表存储
- 二叉树的三叉链表存储结构
- 二叉树的三叉存储
- 二叉树的三叉链表存储结构的简单实现
- 数据结构之---C语言实现二叉树的三叉链表存储表示
- 三叉链表实现-二叉树
- 三叉链表实现二叉树
- 二叉树三叉链表实现类
- C++ 二叉树(三叉链表存储)不使用栈的非递归算法
- 二叉树:三叉链表
- 基于三叉链表存储结构的二叉树的不用栈的非递归遍历
- 二叉树实现类 —— 三叉链表实现
- 三叉链表实现二叉树基本操作
- 平衡二叉树实现(三叉链表 平衡因子方式实现)
- 以php开发服务器后台的android即时通讯app的一种实现思路
- 【LeetCode】Permutations II
- log4j配置祥解
- iOS_31_cocos2d_CCScene
- zoj 1002 Fire Net (简单dfs)
- 二叉树的三叉链表存储(java实现)
- 借助JavaCV实现android手机查看PC摄像头实时视频
- c++11特性与cocos2d-x 3.0之std::bind与std::function
- 【Leetcode】Linked List Cycle
- 软工视频——1-3章总结
- Command line option syntax error.type Command /? for help
- java内存模型
- 正态分布的前世今生
- 正则表达式总结