树
树
树的定义
- 有且只有一个根节点。
- 有若干个互不相交的子树,这些子树本身也是一棵树。
树的分类
一般树:
- 任意一个节点的子节点的个数不受限制。
二叉树:
- 任意一个节点的子节点不超过两个。
- 一般二叉树
- 满二叉树:每一层上的节点数都是最大节点数。
- 完全二叉树:删除满二叉树最底层最右边的连续若干个节点后形成的二叉树。
森林:
- n个互不相交的树的集合。
树的存储
二叉树的存储
连续存储(完全二叉树)
优点:查找某个节点的子节点和父节点很快。
缺点:耗用内存大。
链式存储
优点:耗用内存少。
缺点:不易访问父节点。
一般树的存储
双亲表示法:用连续的空间来存储每个节点,每个节点存储其父节点的下标,根节存储的数组下标为-1。
孩子表示法:将每个节点的子节点都用单链表连接起来,n个节点具有n个孩子链表。
孩子双亲表示法:每个节点同时储存父节点的下标和用链表连接的子节点。
二叉树表示法:
- 把一个普通树转化成二叉树储存。
- 左指针域指向第一个子节点,右指针域指向该节点的兄弟。
森林的存储
- 把森林转化成二叉树存储。
- 把每个树的根节点当成兄弟处理,其余与一般树转换二叉树相同。
二叉树的操作
遍历
先序遍历:(先访问根节点)
- 先访问根节点。
- 再先序访问左子树。
- 再先序访问右子树。
中序遍历:(中间访问根节点)
- 先中序遍历左子树。
- 再访问根节点。
- 再中序遍历右子树。
后序遍历:(最后访问根节点)
- 险中序遍历左子树。
- 再中序遍历右子树。
- 最后访问根节点。
已知两种遍历序列还原原始二叉树:
- 只通过先序和中序,或只通过中序和后序可以唯一确定一个二叉树。
- 不可只通过先序和后序确定。