java用三叉链表构建二叉树_二叉树的三叉链表存储(java实现)

2023-12-10 20:30

本文主要是介绍java用三叉链表构建二叉树_二叉树的三叉链表存储(java实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

package com.fcy.dataStruct;

/**

* 与二叉树的二叉链表存储相比,三叉链表存储

* 多了一个指针域来记录当前节点的父节点

*/

class ThreeLinkBinTree{

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 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());

}

}

运行结果:

0818b9ca8b590ca3270a3433284dd417.png

这篇关于java用三叉链表构建二叉树_二叉树的三叉链表存储(java实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478270

相关文章

使用FileChannel实现文件的复制和移动方式

《使用FileChannel实现文件的复制和移动方式》:本文主要介绍使用FileChannel实现文件的复制和移动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录使用 FileChannel 实现文件复制代码解释使用 FileChannel 实现文件移动代码解释

Spring实现Bean的初始化和销毁的方式

《Spring实现Bean的初始化和销毁的方式》:本文主要介绍Spring实现Bean的初始化和销毁的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Bean的初始化二、Bean的销毁总结在前面的章节当中介绍完毕了ApplicationContext,也就

Java的"伪泛型"变"真泛型"后对性能的影响

《Java的伪泛型变真泛型后对性能的影响》泛型擦除本质上就是擦除与泛型相关的一切信息,例如参数化类型、类型变量等,Javac还将在需要时进行类型检查及强制类型转换,甚至在必要时会合成桥方法,这篇文章主... 目录1、真假泛型2、性能影响泛型存在于Java源代码中,在编译为字节码文件之前都会进行泛型擦除(ty

Java中的getBytes()方法使用详解

《Java中的getBytes()方法使用详解》:本文主要介绍Java中getBytes()方法使用的相关资料,getBytes()方法有多个重载形式,可以根据需要指定字符集来进行转换,文中通过代... 目录前言一、常见重载形式二、示例代码三、getBytes(Charset charset)和getByt

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j