java用三叉链表构造二叉树_三叉链表存储二叉树 - JiaChang的个人空间 - OSCHINA - 中文开源技术交流社区...

本文介绍了二叉树的三叉链式存储结构,通过每个节点包含left、right和parent三个指针,使得节点能便捷访问其父节点。详细讲解了如何定义三叉链表存储的二叉树节点,并提供了添加子节点、获取父节点数据、左右孩子节点以及计算树深度和节点个数的方法。此外,提供了源代码链接供读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的三叉链式存储

三叉链式存储的思想是让每个节点不仅“记住”它的左,右两个节点,还要“记住”它的父节点,因此每个节点需要left,right,parent三个指针。

a8e6638a9f267f6e9e6b7d0ea3180270.png

三叉链表存储方式是对二叉链表的一种改进,通过为树节点添加一个parent引用,可以让每个节点都能非常方便地访问其父节点。

三叉链表存储二叉树的节点定义

//三叉链表存储二叉树的节点定义

class Node{

Object data;//节点数据

Node left;//左孩子指针

Node rigth;//右孩子指针

Node parent;//父节点指针

public Object getData() {

return data;

}

}

为指定节点添加子节点

/***

* 为指定节点添加子节点

* @param parent 指定节点

* @param data新节点的数据

* @param isLift 是否为左孩子

* @return 返回新添加的节点

*/

public Node add(Node parent, E data, boolean isLeft){

if(parent==null){

throw new RuntimeException("指定节点为null,无法添加子节点");

}

if(isLeft&&parent.left!=null){

throw new RuntimeException("指定节点已经存在左孩子,无法添加子节点");

}

if(!isLeft&&parent.rigth!=null){

throw new RuntimeException("指定节点已经存在右孩子,无法添加子节点");

}

Node newNode = new Node();

newNode.data = data;

newNode.parent = parent;

if(isLeft){

parent.left = newNode;

}

else {

parent.rigth = newNode;

}

return newNode;

}

返回指定节点的父节点数据

/***

* 返回指定节点的父节点数据

* @param node

* @return

*/

@SuppressWarnings("unchecked")

public E getParent(Node node){

if(node==null){

throw new RuntimeException("指定节点为null,无法访问其父节点");

}

return (E) node.parent.data;

}

返回指定节点左孩子节点

/***

* 返回指定节点的左孩子节点数据

* @param node 指定节点

* @return 如果左孩子节点不存在则返回null,否则返回左孩子节点的数据

*/

@SuppressWarnings("unchecked")

public E leftChild(Node node){

if(node==null){

throw new RuntimeException("指定节点为null,无法访问其左孩子节点");

}

return node.left.data==null?null: (E) node.left.data;//如果没有左孩子节点则返回空,使用三目运算符判断一下不至于抛空指针异常

}

返回指定节点右孩子节点

/***

* 返回指定节点的右孩子节点数据

* @param node 指定节点

* @return 如果右孩子节点不存在则返回null,否则返回右孩子节点的数据

*/

@SuppressWarnings("unchecked")

public E rigthChild(Node node){

if(node==null){

throw new RuntimeException("指定节点为null,无法访问其右孩子节点");

}

return node.rigth.data==null?null: (E) node.rigth.data;//如果没有右孩子节点则返回空,使用三目运算符判断一下不至于抛空指针异常

}

返回树的深度

/***

* 计算二叉树的深度(后序遍历)

* @param root 根节点

* @return 树的深度

*/

public int deep(Node root){

if(root==null) return 0;//如果是空树,深度为0,递归结束

else {

int m = deep(root.left);//递归计算左子树的深度记为m

int n = deep(root.rigth);//递归计算右子树的深度记为n

return m>n? m+1:n+1;//二叉树的深度为 m 与 n的较大者加1

}

}

返回节点个数

/***

* 统计二叉树中节点的个数(递归)

* @param root 根节点

* @return 节点个数

*/

public int nodeCount(Node root){

if(root==null) return 0;//如果是空树,则节点个数为0,递归结束

else return nodeCount(root.left)+nodeCount(root.rigth)+1;//否则节点个数为左子树的节点个数+右子树的节点个数+1

}

源代码(直接克隆或则下载即可):

https://github.com/JiaChangFormCHN/tree-learn.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值