数据结构(5) 树

一、树的简介

目录

一、树的简介

名词理解:

1、树的简介

2、树的度

3、树的前驱和后继

4、树中结点的层次

如有问题:

求二叉树指定节点所在层次

遍历二叉树

 

推荐一个二叉树遍历的好网址

【图解数据结构】 二叉树遍历


 

 

名词理解:

结点:指树中的一个元素;

结点的度:指结点拥有的子树的个数,二叉树的度不大于2;

数的度:指树中的最大结点度数;

叶子:度为0的结点,也称为终端结点;

高度:叶子节点的高度为1,根节点高度最高;

层:根在第一层,以此类推;

1、树的简介

树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

每个节点有零个或多个子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树;
 

 

除根结点以外的其他结点划分为m(m>=0)个互不相交的有限集合,T0,T1,T2,...,Tm-1,每个结合是一棵树,称为根结点的子树。
树的示例如下:

 

 

2、树的度

树的结点包含一个数据和多个指向子树的分支
结点拥有的子树的数量为结点的度,度为0的结点是叶结点,度不为0的结点为分支结点,树的度定义为树的所有结点中度的最大值。

3、树的前驱和后继

结点的直接后继称为结点的孩子,结点称为孩子的双亲。
结点的孩子的孩子称为结点的孙子,结点称为子孙的祖先。
同一个双亲的孩子之间互称兄弟。

如图

A是B,C,D的双亲

D是H,I,J的双亲

K,L是兄弟

M叶节点无孩子

4、树中结点的层次

 

树中根结点为第1层,根结点的孩子为第2层,依次类推。
树中结点的最大层次称为树的深度或高度

 

 

如有问题:

求二叉树指定节点所在层次

int level(bitree t,binode *p){ //假设二叉树结点互不相同
 int d1,d2;
 if(t==null) return 0;
 if(t==p) return 1;
 d1=level(t->lchild,p);
 d2=level(t->rchild,p);
 if(d1||d2) return 1+(d1>d2?d1:d2);
 return 0;
}

 

二叉树的定义:由一个结点和两颗互不相交、分别称为这个根的左子树和右子树的二叉树构成(递归定义)

二叉树的性质:

1:二叉树的第i层上至多有2^(i-1)个结点

2:深度为k的二叉树,至多有2^k-1个结点

满二叉树:叶子节点一定要在最后一层,并且所有非叶子节点都存在左孩子和右孩子;

最特别的二叉树:完全二叉树:从左到右、从上到下构建的二叉树;

完全二叉树的性质:

1:结点 i 的子结点为2*i 和 2*i+1(前提是都小于总结点数)

2:结点 i 的父结点为 i/2 

二叉树的遍历(要有递归的思想!!!):

1:先序遍历:根->左子树->右子树(先序)

2:中序遍历:左子树->根->右子树(中序)

3:后序遍历:左子树->右子树->根(后序)

遍历二叉树

遍历二叉树共有三种方式,前序遍历(根左右),中序遍历(左根右),后序遍历(左右根)

这三种方式都可以用递归实现,实际上没有什么区别,和创建二叉树的递归过程一样,参考上面的递归图很有用,

只是改变了一下函数调用的顺序

下面是代码


//遍历树
void FrontTree(PTree ps)//前序遍历(根左右)
{
  
  if(ps)
  {
	  printf("%c ",ps->data);
	  FrontTree(ps->Left);
	  FrontTree(ps->Right);
  }
}
 
 
void MidTree(PTree ps)//中序遍历(左根右)
{
  
  if(ps)
  {
	  
	  MidTree(ps->Left);
	  printf("%c ",ps->data);
	  MidTree(ps->Right);
  }
}
void BackTree(PTree ps)//后序遍历(左右根)
{
 
  if(ps)
  {
	  
	  BackTree(ps->Left);
	  BackTree(ps->Right);
	  printf("%c ",ps->data);
  }
}

 

推荐一个二叉树遍历的好网址

 

【图解数据结构】 二叉树遍历

https://www.cnblogs.com/songwenjie/p/8955856.html#%E4%BA%8C%E5%8F%89%E6%A0%91%E9%81%8D%E5%8E%86%E6%96%B9%E6%B3%95

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值