二叉树
-
每个节点至多只有两棵子树_(不存在度大于2的结点)_,有左右子树的分别,次序不可以颠倒
-
完全二叉树
- 将节点数进行编号,每一个编号的结点所在位置与满二叉树上相同
-
满二叉树
- 每层节点都是满的,最后一层是叶子节点
-
二叉树的性质
-
第 层上至多有 个结点
-
深度为 的二叉树至多有 个结点
-
-
叶子节点 (终端结点) 数为 ,度为 的节点数 ,则
-
假设度为1的节点数为 ,所有节点数为 ,所有分支数目
-
-
-
具有 个结点的完全二叉树的深度为
-
如果对一颗树有 个结点的完全二叉树 (深度为 ) 的结点按连续层序编号,则对任一结点 () ,有:
- , 为根结点,否则,双亲结点的编号为
- , 则编号为 的结点没有左孩子,否则左孩子为
- , 则编号为 的结点没有右孩子,否则右孩子为
-
-
二叉树的存储结构
- 顺序存储
- 链式存储
- 二叉链表
- 三叉链表 (多一个指针指向父节点)
-
二叉树的遍历
-
先序遍历
void preOrder(biTree bt){ if( bt != null ){ visit(bt) preOrder(bt.lchild) preOrder(bt.rchild) } } -
中序遍历
void inOrder(biTree bt){ if( bt != null ){ inOrder(bt.lchild) visit(bt) inOrder(bt.rchild) } } -
后序遍历
void postOrder(biTree bt){ if( bt != null ){ postOrder(bt.lchild) postOrder(bt.rchild) visit(bt) } }
-
-
二叉树的非递归遍历
-
栈_(中序遍历)_
-
队列_(层序遍历)_
-
根据先序遍历和中序遍历还原二叉树
- 找出根结点,划分左右子树
- 在左右子树中找出根结点,再划分左右子树
线索二叉树
-
增加两个标志位 ,
-
如果有左孩子,则 存储值,否则存储前驱 (前驱和后继按照遍历的顺序)
-
如果有右孩子,则 存储值,否则存储后继
-
前驱:该结点左子树右指针域为1
-
后继:该结点右子树左指针域为1
树
-
双亲表示法
本节点的值 结点双亲在数组中的位置 -
孩子表示法:将头指针作为一个线性表,孩子结点用单链表存储
例如:
数组下标 0 1 2 null 3 null -
孩子兄弟表示法:二叉树表示法,二叉链表表示法
树、森林、二叉树
- 零棵或有限棵互不相交的数的集合称为森林
- 树是 个结点的有限集