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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory