PS:以下代码均为C++实现
1.二叉树前序遍历 力扣
给你二叉树的根节点
root
,返回它节点值的 前序 遍历。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> str;
TreeNode* cur=root;
while(cur||!st.empty())//cur为空或者st为空两者都为空则退出
{
while(cur)
{
str.push_back(cur->val);//遍历左子树
st.push(cur);
cur=cur->left;
}
cur=st.top();
st.pop();
cur=cur->right;//遍历右子树
}
return str;
}
};
2.二叉树中序遍历 力扣
给定一个二叉树的根节点
root
,返回 它的 中序 遍历 。
//中序遍历和前序遍历差不多
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> str;
TreeNode* cur=root;
while(cur||!st.empty())
{
while(cur)
{
st.push(cur);
cur=cur->left;
}
cur=st.top();
str.push_back(cur->val);
st.pop();
cur=cur->right;
}
return str;
}
};
3.二叉树的后序遍历 力扣
给你一棵二叉树的根节点
root
,返回其节点值的 后序遍历 。
后序遍历和中序遍历差不多,中间多了一步判断的步骤,只需设置一个空指针,然后判断是否左节点是否为空,不为空则先遍历右节点,空指针的目的是为了防止重复遍历。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> nums;
TreeNode* cur=root;
TreeNode* prev=nullptr;
while(cur||!st.empty())
{
while(cur)
{
st.push(cur);
cur=cur->left;
}
TreeNode* top=st.top();
if(top->right==nullptr||top->right==prev)//防止重复遍历
{
prev=top;
st.pop();
nums.push_back(top->val);
}
else
{
cur=top->right;
}
}
return nums;
}
};