二叉树的非递归遍历:
中序遍历:先左孩子,再自己,再右孩子
8
4 15
2 5 10 19
输出结果: 2 4 5 8 10 15 19
思路:
1. 先一直找左孩子直到为空,自己则压入栈中 8 4 2
2. 找到左孩子为空时,取出栈顶元素,2 输出
3. 将2的右孩子取出,删除2这个结点
4. 取出的右孩子当成新的结点重新找左孩子直到为空,因为2的右孩子为空所以没有元素压入栈中所以
取出栈顶元素 4输出
5. 将4的右孩子取出 删除4这个结点
6. 123部一直一直循环下去直到栈的元素为空
过程:
栈:(底 --> 顶) 输出:
8
8 4
8 4 2
8 4 2
8 5 2 4
8 2 4 5
15 2 4 5 8
15 10 2 4 5 8
15 2 4 5 8 10
19 2 4 5 8 10 15
2 4 5 8 10 15 19
前序遍历:先自己,再左孩子,再右孩子
输出自己,右孩子入栈,处理左孩子
8
4 15
2 5 10 19
输出结果: 8 4 2 5 15 10 19
思路:
1. 自己不为空就输出 压入右孩子,跟到左孩子,直到左孩子为空
2. 取出的右孩子当成新的结点重新遍历 将一二循环直到栈的元素为空
过程:
栈:(底 --> 顶) 输出:
15 8
15 5 8 4 2
15 5 8 4 2
15 8 4 2 5
19 8 4 2 5 15
19 8 4 2 5 15 10
8 4 2 5 15 10 19
后序遍历:先左孩子,再右孩子,再自己
自己入栈, 处理左孩子,再右孩子入栈,再处理自己
8
4 15
2 5 10 19
输出结果: 2 5 4 10 19 15 8
思路:
1. 一直将结点压入栈中取左孩子,
2. 如果上一次没有处理此节点的右孩子(因为没有处理右孩子相当于右孩子的父节点需要在右孩子输出后输出),所以此节点不处理,处理其右孩子
3. 如果上一次处理了此节点的右孩子,此结点输出置为空,将此节点做记号表示删除。
过程:
栈:(底 --> 顶) 输出:
8 4 2
8 4 5 2
8 4 2 5
8 2 5 4
8 15 10 2 5 4
8 15 19 2 5 4 10
8 15 2 5 4 10 19
8 2 5 4 10 19 15
2 5 4 10 19 15 8
删除的情况:
1. 叶子节点,直接删掉
2. 只有左孩子
3. 只有右孩子
4. 有两个孩子,则在左子树中查找最大值的结点,
将其拷贝到待删除节点,删除最大值节点
1. 叶子节点,直接删掉
1)被删除结点是父结点的左孩子,父结点左孩子置空 ,被删除结点是父结点的右孩子,父结点右孩子置空,如果父节点为空,删除根节点
2.只有左孩子
1)删除B
C C
B --> A
A
C C
B --> A
A
2)删除结点为根结点,将a节点置位根节点 删除b节点
3)否则b是c的左孩子,a就改为c的左孩子否则相反。c成为a的父亲,删除b
3.只有右孩子删除B
C C
B --> A
A
C C
B --> A
A
1)删除结点为根结点,将a节点置位根节点 删除b节点
2)否则b是c的左孩子,a就改为c的左孩子否则相反。c成为a的父亲,删除b
4. 有两个孩子,则在左子树中查找最大值的结点,
将其拷贝到待删除节点,删除最大值节点 ,
查找值:从根节点查找,大于取右孩子,小于取左孩子,等于输出,小于返回
查找最大值:找左孩的右孩子,一直找下去直到为空(如果右孩子没有则为情况三只有右孩子)
找到最大值后拷贝,替换删除节点,