9、二叉树存储结构结点定义:三叉链表

  1 package ren.laughing.datastructure.baseImpl;
  2
  3 import ren.laughing.datastructure.base.Node;
  4 /**
  5  * 二叉树存储结构结点定义:三叉链表
  6  * 三个指针域包含父结点、左孩子、右孩子
  7  * @author Laughing_Lz
  8  * @time 2016年4月13日
  9  */
 10 public class BinTreeNode implements Node{
 11     private Object data;//数据域
 12     private BinTreeNode parent;//父结点
 13     private BinTreeNode lChild;//左孩子
 14     private BinTreeNode rChild;//右孩子
 15     private int height;//以该结点为根的子树高度
 16     private int size;//该结点子孙数,包含该结点本身
 17
 18     public BinTreeNode() {
 19         this(null);
 20     }
 21
 22     public BinTreeNode(Object data) {
 23         this.parent = null;
 24         this.lChild = null;
 25         this.rChild = null;
 26         this.size = 1;
 27         this.height = 0;
 28         this.data = data;
 29     }
 30
 31     @Override
 32     public Object getData() {
 33         return data;
 34     }
 35
 36     @Override
 37     public void setData(Object obj) {
 38         data = obj;
 39     }
 40     //has
 41     public boolean hasParent(){
 42         return parent != null;
 43     }
 44     public boolean hasLChild(){
 45         return lChild != null;
 46     }
 47     public boolean hasRChild(){
 48         return rChild != null;
 49     }
 50     //is
 51     public boolean isLeaf(){
 52         return !hasLChild()&&!hasRChild();
 53     }
 54     public boolean isLChild(){
 55         return hasParent()&&this == parent.lChild;
 56     }
 57     public boolean isRChild(){
 58         return hasParent()&&this == parent.rChild;
 59     }
 60     //get
 61     public int getHeight(){
 62         return height;
 63     }
 64     public int getSize(){
 65         return size;
 66     }
 67     public BinTreeNode getLChild(){
 68         return lChild;
 69     }
 70     public BinTreeNode getRChild(){
 71         return rChild;
 72     }
 73     public BinTreeNode getParent(){
 74         return parent;
 75     }
 76
 77     //operate
 78     //★更新以结点为根的子树高度
 79     public void updateHeight(){
 80         int newH = 0;
 81         if (hasLChild()) {
 82             newH = Math.max(newH, getLChild().getHeight()+1);
 83         }
 84         if (hasRChild()) {
 85             newH = Math.max(newH, getRChild().getHeight()+1);
 86         }
 87         if(newH == height){
 88             return;
 89         }
 90         height = newH;
 91         if(hasParent()){
 92             this.getParent().updateHeight();//★递归更新父结点高度
 93         }
 94     }
 95     //更新该结点的子孙数
 96     public void updateSize(){
 97         size = 1;
 98         if(hasLChild()){
 99             size = size+getLChild().size;
100         }
101         if(hasRChild()){
102             size= size+getRChild().size;
103         }
104         if(hasParent()){
105             this.getParent().updateSize();
106         }
107     }
108     //断开与父结点的关联
109     public void server(){
110         if(hasParent()){
111             if(this == getParent().getLChild()){
112                 getParent().lChild = null;
113             }
114             if(this == getParent().getRChild()){
115                 getParent().rChild = null;
116             }
117             getParent().updateHeight();
118             getParent().updateSize();
119             parent = null;
120         }
121     }
122     public BinTreeNode setLChild(BinTreeNode lc){
123         BinTreeNode oldLChild = lChild;
124         if(hasLChild()){
125             lChild.server();
126         }
127         if(lc != null){
128             lc.server();
129             this.lChild = lc;
130             lc.parent = this;
131             this.updateHeight();
132             this.updateSize();
133         }
134         return oldLChild;
135     }
136     public BinTreeNode setRChild(BinTreeNode rc){
137         BinTreeNode oldRChild = rChild;
138         if(hasRChild()){
139             rChild.server();
140         }
141         if(rc != null){
142             rc.server();
143             this.rChild = rc;
144             rc.parent = this;
145             this.updateHeight();
146             this.updateSize();
147         }
148         return oldRChild;
149     }
150 }
时间: 2024-08-26 00:34:53

9、二叉树存储结构结点定义:三叉链表的相关文章

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

浅谈数据结构之二叉树存储结构实现(七)

树:是n个结点的有限集:n=0时称为空树.在任意一棵非空树中,有且只有一个特定的结点称为根结点:其余的结点可分为m(m>0)个互不相交的有限集,其中每一个有限集都是一棵子树.结点拥有的子树数称为结点的度:度为0的结点称为叶结点或者终端结点,度不为0的结点称为分支结点或者非终端结点:树的度就是树内各结点的度的最大值. 二叉树的特点有:(1).每个结点最多有两棵子树,所以二叉树不存在度大于2的结点(注意:不是只有两棵子树,而是最多有两棵子树,没有子树或者有一颗子树都是可以的);(2).左子树和右子树

存储结构二叉树

二叉树的存储结构有两种:顺序存储结构和链式存储结构. 顺序存储结构 对于满二叉树和全然二叉树来说,能够将其数据元素逐层存放到一组连续的存储单元中,如图6-3 所看到的. 用一维数组来实现顺序存储结构时.将二叉树中编号为i 的结点存放到数组中的第i 个分量中.如此依据性质6.7,能够得到结点i 的父结点.左右孩子结点分别存放在.2i 以及2i+1 ?i / 2? 分量中. 图6-3 顺序存储结构 这样的存储方式对于满二叉树和全然二叉树是非常合适也是高效方便的.由于满二叉树和全然二叉树採用顺序存储结

二叉树的存储结构

二叉树的存储结构有两种:顺序存储结构和链式存储结构. 顺序存储结构 对于满二叉树和完全二叉树来说,可以将其数据元素逐层存放到一组连续的存储单元中,如图6-3 所示.用一维数组来实现顺序存储结构时,将二叉树中编号为i 的结点存放到数组中的第i 个分量中.如此根据性质6.7,可以得到结点i 的父结点.左右孩子结点分别存放在.2i 以及2i+1 ?i / 2? 分量中. 图6-3 顺序存储结构 这种存储方式对于满二叉树和完全二叉树是非常合适也是高效方便的.因为满二叉树和完全二叉树采用顺序存储结构既不浪

_DataStructure_C_Impl:二叉树的二叉链表存储结构

// _DataStructure_C_Impl: #include<stdio.h> #include<stdlib.h> #define MaxSize 100 typedef char DataType; typedef struct Node{ //二叉链表存储结构类型定义 DataType data; //数据域 struct Node *lchild; //指向左孩子结点 struct Node *rchild; //指向右孩子结点 }*BiTree,BitNode;

数据结构 - 二叉树的存储结构

顺序存储结构 二叉树存储结构的类型定义: #define MAX_SIZE 100 typedef telemtype sqbitree[MAX_SIZE]; 用一组地址连续的存储单元依次"自上而下.自左至右"存储完全二叉树的数据元素. 对于完全二叉树上编号为i的结点元素存储在一维数组的下标值为i-1的分量中,如图6-6(c)所示. 对于一般的二叉树,将其每个结点与完全二叉树上的结点相对照,存储在一维数组中, 链式存储结构 设计不同的结点结构可构成不同的链式存储结构. (1) 结点的类

03.线性表(二)链式存储结构.单链表1

链式存储结构.单链表1 1.基本概念 为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置) (1)数据域:存储线性表数据元素数据信息的域称为数据域: (2)指针域:把存储直接后继位置(下一个数据元素的地址)的域称为指针域,指针域中存储的信息为指针或链: (3)结点(Node):由数据域和指针域两部分信息组成数据元素ai的存储映像,称为结点. (4)头指针:把链表中第一个结点的存储

Java数据结构-树及树的存储结构

树的定义:n(n>=0)个节点的有限集. n=0时称为空树. n!=0时为非空树,有且仅有一个特定的节点--根:n>1时,其它节点可以分为m(m>0)个互不相交的有限集T1~Tm,其中每一个集合本身又是一棵树,并且称为根的子树. 树的一些基本术语: 树的结点:由一个数据元素和若干个指向其子树的分支组成. 结点的度:结点所拥有的子树的个数(即分支数)称为该结点的度. 叶子结点:度为0的结点称为叶子结点,或者称为终端结点. 分支结点:度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结

队列的存储结构和常见操作(c 语言实现)

一.队列(queue) 队列和栈一样,在实际程序的算法设计和计算机一些其他分支里,都有很多重要的应用,比如计算机操作系统对进程 or 作业的优先级调度算法,对离散事件的模拟算法,还有计算机主机和外部设备运行速度不匹配的问题解决等,很多很多.其实队列的本质还是线性表!只不过是一种特殊的或者说是受限的线性表,是这样的: 1).限定在表的一端插入.另一端删除. 插入的那头就是队尾,删除的那头就是队头.也就是说只能在线性表的表头删除元素,在表尾插入元素.形象的说就是水龙头和水管,流水的水嘴是队头,进水的