二叉树 binary tree
1. 定义
二叉树是树的一种,具有如下特点:
(1)每个结点最多有两颗子树,结点的度最大为2。
(2)左子树和右子树是有顺序的,次序不能颠倒。
(3)即使某结点只有一个子树,也要区分左右子树。
2. 二叉树的遍历
(1)先序遍历
又叫先根遍历、先序遍历、前序周游
遍历顺序:VLR,根左右
(2)中序遍历
又叫中根遍历、中序周游
遍历顺序:LVR,左根右
(3)后序遍历
又叫后根遍历、后序周游
遍历顺序:LRV,左右根
3. 特殊二叉树
(1)满二叉树:
所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是满二叉树。
特点:
a. 叶子只能出现在最下一层。
b. 非叶子结点度一定是2.
c. 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。
(2)完全二叉树
对一棵具有n个结点的二叉树按层序排号,如果编号为i的结点与同样深度的满二叉树编号为i结点在二叉树中位置完全相同,就是完全二叉树。
特点:
a. 叶子结点只能出现在最下一层(满二叉树继承而来)
b. 最下层叶子结点一定集中在左 部连续位置。
c. 倒数第二层,如有叶子节点,一定出现在右部连续位置。
d. 同样结点树的二叉树,完全二叉树的深度最小(满二叉树也是对的)。
4. 二叉搜索树(binary search tree)
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
二叉搜索树的查找和插入都很简单,这里就不叙述了。
重点谈谈二叉搜索树一个节点的删除,分为三种情况:
(1)被删除节点是一个叶子节点
这种情况,直接删除即可
(2)被删除节点只有左或者右子树
这种情况,只需要把非空的左子树或者右子树连接到父节点即可(替代要删除的节点)
(3)被删除的节点左右子树都非空
这种情况下,就要找到应被删除节点x的左子树中值最大的叶子节点w(或右子树中值最小的叶子节点),将这个叶子节点w的值与原应该被删除节点x的值交换,然后删除该叶子节点w(即找了个替死鬼)。
如果原应被删除的节点x的左子树根节点y,只有左子树a,右子树为空(即左子树的根节点y是左子树的最大值),那么要在原被删节点x与左子树根节点y值交换之后,把这个左子树的左子树a,连到原被删除节点x的左指针上,然后删除这个左子树根节点y。