树
为什么要使用树
有序数组插入
数据项和删除
数据项太慢; 链表查找
数据太慢; 但是在树中可以 快速的 查找
插入
和删除
数据项!
树的分类
树形结构属于非线性结构
,常见的树形结构有树和二叉树
!
树的基本术语
节点的度和树的度
,分支节点和叶子节点
,路径和路径长度
,孩子节点、双亲节点、兄弟节点
,节点的层次和树的高度
,有序树和无序树
,森林
树的基本运算
A、寻找满足某种特定关系的节点,如寻找当前节点的双亲节点等;
B、插入或删除某个节点,如在树的当前节点插入一个新节点或者删除当前节点的第i个孩子节点等;
C、遍历树种每个节点;
数的遍历运算是指按某种方式访问树中的每一个节点,且每一个节点只能被访问一次!
数的遍历运算主要有先根遍历、后根遍历和层次遍历!
注意:先根遍历和后根遍历算法都是递归
的!
D、遍历规则
先根遍历
:访问根节点后,按照从左到右的次序先根遍历根节点的每一棵子树!
后根遍历
:按照从左到右的次序后根遍历根节点的每一棵子树后,访问根节点!
层次遍历
:从根节点开始,从上到下、从左到右访问树中每一个节点!
二叉树
二叉树的定义:
最多只有两个节点!
,满二叉树
,完全二叉树
二叉树的性质:二叉树-百度百科
二叉树与树、森林之间的转换
二叉树的存储结构主要有
顺序存储结构和链式存储结构
两种!二叉树的基本运算有
创建二叉树
,查找节点
,查找孩子节点
,求高度
,输出二叉树
二叉树的遍历
在遍历一棵树时,根据访问根节点和遍历子树的先后关系有两种遍历方法,即先根遍历和后根遍历
!
在二叉树中,左子树和右子树是有严格区别的,因此在遍历一棵二空二叉树时,根据访问根节点、遍历左子树、遍历右子树之间的先后关系可以组合成6种遍历方法!
若规定先遍历左子树,后遍历右子树,则对于非空二叉树可以得到3种递归的遍历方法,分别是先序遍历、中序遍历、后序遍历、层次遍历
!
二叉树遍历规则
先序遍历
:访问根节点 → 先序遍历左子树 → 先序遍历右子树
中序遍历
:中序遍历左子树 → 访问根节点 → 中序遍历右子树
后序遍历
:后序遍历左子树 → 后序遍历右子树 → 访问根节点
层次遍历
:访问根节点(第一层) → 从左到右访问第二层的所有节点 → 从左到右访问第三层的所有节点...第n层所有节点
二叉树遍历算法分为
二叉树遍历递归算法、二叉树遍历非递归方法、层次遍历算法!
博客参考文章
红黑树
二叉树存在的问题
普通的二叉树作为数据存储工具很有优势,可以快速的插入、删除、查找数据项。遗憾的是,这仅仅是针对随机数据,如果插入的是随机数据就变得很慢了!
引入概念:
平衡树和非平衡树
插入随机的数据就为平衡树!
插入有序的数据就为非平衡树!
因为插入的数据一旦变得有序的话,则前面的遍历规则则完全发挥不出优势,就和链表是一样的了,所以应该杜绝非平衡树这种情况!
博客参考文章
线索二叉树
为什么要用线索二叉树
对于一个有n个结点的二叉链表,每个结点有指向左右孩子的两个指针域,所以一共是2n个指针域。
而n个结点的二叉树一共有n-1条分支线树,即其实是存在2n-(n-1)=n+1个空指针域。这些空间不存储任何事物,造成空间的浪费,就想到了线索二叉树。
线索二叉树:指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树。
其中对二叉树以某种次序遍历使其变为线索二叉树的过程称做是线索化。
对于有大量的插入和查找的二叉树来说,线索二叉树比较适用。
哈夫曼树
为什么要用哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树!
博客参考文章