数据结构:c++高级数据结构算法-----》树&二叉树的基本特性

树的定义:

树是n个结点的有限集。在任意一颗非空树中:(1)有且仅有一个特定的根的结点(2)当n>1,其余结点可分为m个互不相交的有限集合,其中每个集合本身又是一棵树,并且成为子树,如下图所示

在这里插入图片描述

图中:(a)是只有一个根结点的树;(b)是有13个结点的树,其中A是根,其余结点分成3个互不交集的子集;

  • T1={B,E,F,K,L}
  • T2={C,G}
  • T3={D,H,I,J,M}

T1,T2,T3都是根A的子树,其本身也是一棵树。T1还可以再分:

  • T11={E,K,L}
  • T12={F}
  • T11与T12都是B的子树

结点的分类

树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度,度为零的结点称为叶结点或终端结点;度不为零的结点称为非终端结点或分枝结点。除根结点之外,分支结点也称为内部结点,树的度是树内各结点的度的最大值。
如下图所示:

这颗树结点的度的最大值是结点D的度,为3,所以树的度也为3。

结点间的关系:

结点的子树的根称为该结点的孩子(child),相应地,该结点称为孩子的双亲。
同一个双亲的孩子之间互称兄弟。结点的祖先是从根到该结点所经分支上的所有结点。
例:H结点来说,D,B,A都是它的祖先。
以某结点为根的子树的任意结点都成为该结点的子孙。
B的子孙有D,G,H,I。

树的创建

四种方法可以创建一颗树

(1)二叉链表表示法
(2)三叉链表表示法
(3)双亲链表
(4)线索表示法

下面为代码注释:

1.二叉链表示法
typedef struct BiTNode
{
   int data;
   struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//打造一颗树
int main()
{
  BiTNode t1,t2,t3,t4,t5;//定义5个结点
  t1.data = 1;
  t2.data = 2;
  t3.data = 3;
  t4.data = 4;
  t5.data = 5;
  //打造结点与结点之间的关系
   t1.lchild = &t2;
   t1.rchild = &t3;
   t2.lchild = &t4;
   t3.lchild = &t5; 
}
2.三叉链表法
  typedef struct TriTNode
  {
     int data;
     struct TriTNode *lchild , *rchild;
     strcut TriTNode *parent;//父
  }TriTNode,*TriTree;

int main()
{
  //创建树的结点
 BiTNode t1,t2,t3,t4,t5;
 t1.data = 1;
 t2.data = 2;
 t3.data = 3;
 t4.data = 4;
 t5.data = 5;

 //树的关系
 t1.lchild = &t2;
 t1.rchild = &t3;
 t2.lchild = &t4;
 t3.lchild = &t5; 
 return 0;
}
3.双亲链表(较难):

双亲链表名字由来:子结点中保存,了双亲位置的信息

typedef struct BPTNode
{
    int data;
    int parentPosition;//指向双亲的指针,数组下标
    char LRTag;//左右孩子标志域
}BPTNode;

typedef struct BPTree
{
     BPTNode node[100];//因为结点是分散的,需要把结点存储到数组中
     int num_node;//结点数目
     int root;//根节点的位置//此域储存的是父亲结点在数组的下标
}BPTree;

int main()
{
  BPTree tree;
  //根结点
  tree.nodes[0].parentPositon = 1000 ;

 //B结点
 tree.nodes[1].parentPosition = 0;
 tree.nodes[1].data = 'B';
 tree.nodes[1].LRTag = 1 ; 

  //C结点
 tree.nodes[2].parentPosition = 0;
 tree.nodes[2].data = 'C';
 tree.nodes[2].LRTag = 2 ;
 
 system("pasue"); 
}

二叉树

二叉树的定义:

二叉树是另外一种树形结构,它的特点是每个结点至多只有两棵子树。注意:

  • 二叉树的子树有左右之分
  • 其次序不能任意颠倒

二叉树的性质:

  • 在二叉树的第i层上至多有2*i个结点(i>=1)
  • 深度为k的二叉树至多有2*(k+1)次方-1个结点(k>=1)
  • 对任意一颗二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1.
  • 具有n个结点的完全二叉树的深度为[log2n]+1

二叉树的分类:

1.满二叉树:一颗深度为k且有2k-1个结点的二叉树(特点:每层都充满了结点)

2.完全二叉树:
(1).第k-1层和满二叉树一样
(2).最后一层:叶子结点尽力靠左

注意:左子树是满二叉树,右孩子是满二叉树,且高度均相等,所以才能称为满二叉树

二叉树的存储结构:

顺序存储结构:
按二叉树的结点“自上而下,从左至右”编号,用一组连续的存储单元存储。

缺点:(1)浪费空间;(2)插入,删除不便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值