数据结构之数和二叉树(一)

1.0 重点知识

  1. 树的遍历
  2. 二叉树的性质
  3. 二叉树和树的存储表示
  4. 二叉树的遍历及算法实现
  5. 树与二叉树之间的转换
  6. 哈夫曼树及其应用

2.0 树的定义

树是n (n>0)个结点的有限集合 n = 0 就是空树了
树有一下几个条件.

  1. 有且仅有有个根结点
  2. 除了跟结点外 其余结点呗分成了 n 个互不相交的子树

3.0 一些基本术语

  1. 结点 树中的数据元素
  2. 节点的度 这个节点的子树的个数
  3. 树的度 树中结点度的最大值
  4. 叶子结点 度为0的结点 也叫终端结点
  5. 分支结点 也叫非终端结点 不是叶子结点就是分支结点
  6. 孩子 、双亲、兄弟节点 这个不知道咋说 很好理解吧 还有祖先 子孙
  7. 路径
  8. 路径长度
  9. 结点的层数
  10. 树的深度
  11. 层序编号
  12. 有序数
  13. 无序树
    这里写图片描述
    补充 书中图 5-2 a图 A B E就是一条路径 路径长度就是 2 也就是边数呗

4.0 树的常用操作

例子均是以 书中图 5-2 a图 为例子

4.1 前序遍历

顺序 中 左 右

A B D E F C G

这里注意每次进入一个子树均按中左右顺序进行遍历

4.2 后序遍历

左右中

D E F B G C A

4.3 层序遍历 也叫广度遍历

一层一层来的
ABCDEFG

5.0 树的表示法

  • 双亲表示法
    这个简单 就是数据域含有两个元素 一个是我们存着的数据,另一个是这个节点双亲的坐标
struct Node{
    int data;
    int position;
}

上个图
这里写图片描述

存储结构是数组
优点是找双亲节点方便
- 孩子表示法
- 多重链表表示法
这个就更简单了

struct Node1{
    int data;
    int degree;
    Node* child2;
    Node* child3;
    Node* child4;
    Node* child5;
}


struct Node2{
    int data;
    Node* child2;
    Node* child3;
    Node* child4;
    Node* child5;
    Node* child6;
}

Node1 中指针域指向该节点的所有孩子节点 指针数等于该节点的度 很少采用 因为节点的度不同时,很难操作
Node2 中指针域指向该节点的所有孩子节点,指针数等于树的度,浪费了存储空间便于操作

  • 孩子链表表示法
    这个是数组和链表的结合 假设有 ABCD四个节点

那么这四个节点存储方式为

struct Node{
    int data;
    Node* child;
}

构成一个数组,然后指针域指向他的孩子节点

上图
这里写图片描述
优点是找兄弟节点方便
- 双亲孩子表示法

这个就是双亲表示法和孩子链表表示法的综合 直接上图 不解释

这里写图片描述

查找双亲兄弟都方便
- 孩子兄弟表示法

节点结构


struct Node{
    int data;
    Node* child;//指向第一个孩子节点
    Node* rightBrother;//指向右兄弟节点

}

这个的意思就是假如节点 A 的孩子节点是BCD 那么A的孩子节点指针指向的是B(也就是第一个) 右兄弟指针指向NULL(跟结点没有兄弟)

然后 B的孩子节点指向NULL (他没有孩子节点) B的右兄弟指向 C 同理 C的右兄弟执行D
-

上图
这里写图片描述

这种方法的有点是便于实现树的各种操作

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值