二叉树的三叉链式存储
三叉链式存储的思想是让每个节点不仅“记住”它的左,右两个节点,还要“记住”它的父节点,因此每个节点需要left,right,parent三个指针。
三叉链表存储方式是对二叉链表的一种改进,通过为树节点添加一个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