java用三叉链表构建二叉树,二叉树的三叉链表存储及其Java实现

2023-12-10 20:30

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

三叉链表存储的思想是让每个节点持有三个引用parent、left、right,分别指向其父节点、左子节点和右子节点。如下图所示:

0818b9ca8b590ca3270a3433284dd417.png

因此,三叉链表存储的节点大致如:

class Node{

T data;

Node parent;

Node left;

Node right;

}Java实现代码:

package com.liuhao.DataStructures;

import com.liuhao.DataStructures.TwoLinkBinTree.TreeNode;

public class ThreeLinkBinTree {

public static class TreeNode{

Object data;

TreeNode parent;

TreeNode left;

TreeNode right;

public TreeNode() {

}

public TreeNode(Object data) {

this.data = data;

}

public TreeNode(Object data, TreeNode parent, TreeNode left,

TreeNode right) {

this.data = data;

this.parent = parent;

this.left = left;

this.right = right;

}

}

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 + "节点为空,不能添加子节点!");

}

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){

parent.left = newNode;

}else{

parent.right = newNode;

}

//让新节点的parent引用指向parent节点

newNode.parent = parent;

return newNode;

}

//判断二叉树是否为空

public boolean isEmpty(){

return root.data == null;

}

//获取根节点

public TreeNode getRoot(){

if(isEmpty()){

throw new RuntimeException("树为空,无法获取根节点!");

}

return root;

}

//获取指定节点的父节点

public TreeNode getParent(TreeNode node){

if(node == null){

throw new RuntimeException("节点为空,无法获取父节点!");

}

if(root == node){

throw new RuntimeException("根节点无法获取父节点!");

}

return node.parent;

}

//获取指定节点的左子节点

public TreeNode getLeft(TreeNode parent){

if(parent == null){

throw new RuntimeException(parent + "节点为空,不能获取子节点!");

}

return parent.left == null ? null : parent.left;

}

//获取指定节点的右子节点

public TreeNode getRight(TreeNode parent){

if(parent == null){

throw new RuntimeException(parent + "节点为空,不能获取子节点!");

}

return parent.right == null ? null : parent.right;

}

//获取指定节点的深度

private int getDeep(TreeNode node){

if(node == null){

return 0;

}

if(node.left == null && node.right == null){

return 1;

}else{

int leftDeep = getDeep(node.left);

int rightDeep = getDeep(node.right);

int max = leftDeep > rightDeep ? leftDeep : rightDeep;

return max + 1;

}

}

public int getTreeDeep(){

return this.getDeep(root);

}

}从上面的代码可以看出,三叉链表存储只是对而二叉链表的改进,通过增加一个parent的引用,可以让每个节点都能方便地访问其父节点。

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



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

相关文章

使用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