/*
用递归写二叉树的遍历是很容易的,但是用非递归的话实现就相对来说比较复杂了。
首先,递归的本质也是压栈出栈的过程,所以我们可以用一个栈来模拟系统的递归过程。
比如我们要打印如下的二叉树:
1
/ \
2 3
拿前序遍历来说,我们首先我访问1,然后访问1的左,然后访问1的右
我们可以用一个栈来记录我们的操作
首先我们要把访问1这个节点,所以我们要将访问1这个节点压栈
之后我们当这个栈不为空的时候,每次操作的都是栈顶的元素,如果栈顶元素的信息是访问这个节点,我们就将这个节点的访问右节点,访问左节点,打印节点以此入栈
go代表访问。print代表打印
| |
| |
| |
| |
| |
| go root |
|-----------| 代表访问root节点
我们取出栈顶元素进行分析
访问root节点,完了之后访问root的左节点,之后访问root的右节点
但是我们压栈的顺序要相反,先压go right,最后压print node
| |
| |
| |
| print node|
| go left |
| go right|
|-----------|
之后我们再从栈顶拿出一个元素,进行分析,如果是print,就进行打印,最后将栈顶元素弹出
| |
| |
| |
| |
| go left |
| go right|
|-----------|
打印:1
之后我们接着分析栈顶元素,go left代表访问root的左节点,如果是访问,我们就按照上面的操作以此接着压栈
| |
|print left |
|left->left |
| left->right|
| |
| go right |
|----------- |
按照这个过程,我们可以写出如下代码
*/
#include <iostream>
#include <stack>
#include <vector>
#include <cctype>
using namespace std;
//节点的定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
二叉搜索树的前序、中序、后序遍历(非递归实现)
最新推荐文章于 2022-03-20 12:54:32 发布