1.前言
提醒自己,对二叉树的操作,要对递归函数了解透彻,并熟练二叉树的递归遍历。
2. 解题
2.1 确定遍历类型
- 后序遍历一定可行
作为深度优先遍历,找到左子树最深处的节点后返回进行“访问”,以下将这个过程描述为回溯
。
在回溯的过程中,实现交换。自底向上所有的回溯完成,交换也完成。后序遍历确保根节点最后被"访问"。
2.2 代码
void f(BiTree T) {
if (T == NULL) {
return;
}
f(T->lchild);
f(T->rchild);
if (T->lchild == NULL && T->rchild != NULL) { // 根结点左子树最深处的结优先判断,再逐层回溯
T->lchild = T->rchild;
T->rchild = NULL;
}
}
3. 后记
-
后序遍历的特性
兼容递归删除节点的逻辑。中序和先序,结点正式触发逻辑后,还需要再经过该节点,如果触发逻辑为删除节点,则破坏了整个递归过程。后序遍历,结点的逻辑触发,发生在该节点被算法最后一次遍历到,所以可以进行删除操作,不影响递归过程。 -
推广
- 所有系统资源按依赖关系释放
- 删除系统中某个进程的进程树