目录
- [前序遍历:根 左 右](#前序遍历:根 左 右)
- [中序遍历:左 根 右](#中序遍历:左 根 右)
- [后序遍历:左 右 根](#后序遍历:左 右 根)
前序遍历:根 左 右
实现思想:
需要创建一个栈和一个vector容器
栈用来保存最左路径的节点
vector用来保存遍历的数据
1.首先用一个while循环将二叉树的最左路径节点全部压入栈内,同时由于前序遍历的特性,也将该节点的值同时压入vector容器内 。
2.循环完成后,栈顶元素为二叉树的最左节点。将该节点获取为当前节点后,对栈顶元素进行移除。
3.访问当前节点的右子树。
4.重复循环,直到当前节点为空,或者栈为空。
实现过程:
cpp
class Solution
{
public:
//前序遍历:根 左 右(非递归)
vector<int> preorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> vec;
TreeNode* cur = root;
while (cur || !st.empty())
{
while (cur)
{
//将二叉树最左路径压入栈内
st.push(cur);
//将最左节点的值压入vector内
vec.push_back(cur->val);
cur = cur->left;
}
//获取最左节点
cur = st.top();
//将最左节点从栈内移除
st.pop();
//访问右子树
cur = cur->right;
}
return vec;
}
};
中序遍历:左 根 右
实现思想:
和前序遍历十分类似,不同之处在于将节点值压入vector的位置不一样。
前序遍历是在将二叉树最左路径节点压入栈的同时,也将该节点的值压入vector。
但是中序遍历是要先从最左节点开始进行,因此将节点值压入vector的操作换到第二步完成。
创建一个栈和一个vector容器
栈用来保存最左路径的节点
vector用来保存遍历的数据
1.首先用一个while循环将二叉树的最左路径节点全部压入栈内。
2.循环完成后,栈顶元素为二叉树的最左节点。将该节点获取为当前节点后,对栈顶元素进行移除,并将该节点的值压入vector容器 。
3.访问当前节点的右子树。
4.重复循环,直到当前节点为空,或者栈为空。
实现过程:
cpp
class Solution
{
public:
//中序遍历:左 根 右(非递归)
vector<int> inorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> vec;
TreeNode* cur = root;
while (cur || !st.empty())
{
while (cur)
{
//将二叉树最左路径压入栈内
st.push(cur);
cur = cur->left;
}
//获取最左节点
cur = st.top();
//将最左节点从栈内移除
st.pop();
//将最左节点的值压入vector内
vec.push_back(cur->val);
//访问右子树
cur = cur->right;
}
return vec;
}
};
后序遍历:左 右 根
实现思想:
创建一个栈和一个vector容器
栈用来保存最左路径的节点
vector用来保存遍历的数据
创建两个指针
一个指向当前节点、一个指向上一栈顶节点
1.首先用一个while循环将二叉树的最左路径节点全部压入栈内。
2.循环完成后,栈顶元素为二叉树的最左节点。将栈顶元素获取为top节点。
3.判断top节点是否可以压入vector,条件为top节点的右子树为空,或者top节点的右子树已经被压入vector。满足条件后将该top节点压入vector,同时将prev更新。
3.如果不满足条件,则访问top节点的右子树。
4.重复循环,直到当前节点为空,或者栈为空。
实现过程:
cpp
class Solution
{
public:
//后序遍历:左 右 根(非递归)
vector<int> postorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* prev;
vector<int> vec;
while (cur || !st.empty())
{
while (cur)
{
st.push(cur);
cur = cur->left;
}
//获取栈顶元素
TreeNode* top = st.top();
//判断当前的节点是否可以遍历
if (top->right == nullptr || top->right == prev)
{
vec.push_back(top->val);
st.pop();
prev = top;
}
else
//访问右子树
cur = top->right;
}
return vec;
}
};