leetcode链接:
- 144.二叉树的前序遍历
- 94.二叉树的中序遍历
- 145.二叉树的后序遍历
递归遍历
代码随想录链接
一刷状态:通过
思路
class Solution {
public:
void Traversal(TreeNode* root, vector<int>& result)
{
if(root==nullptr) return;
result.push_back(root->val);
Traversal(root->left, result);
Traversal(root->right, result);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
Traversal(root, result);
return result;
}
};
迭代遍历
代码随想录链接
一刷状态:通过
思路
- 前序遍历(中左右)
使用栈实现,先把中间的值拿出来,再将右孩子压入栈,再将左孩子压入栈,最后就是中左右的顺序。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root==nullptr) return result;
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if(node->right!=nullptr)st.push(node->right);
if(node->left!=nullptr)st.push(node->left);
}
return result;
}
};
- 中序遍历(左中右)
需要向左遍历到底,使用指针来实现遍历,类似链表的写法,使用cur = cur->left 来遍历,if(cur!=nullptr) 来判断结束条件
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root==nullptr) return result;
TreeNode* cur = root;
while(!st.empty()||cur!=nullptr)
{
if(cur!=nullptr)
{
st.push(cur);
cur = cur->left;
}
else
{
TreeNode* node = st.top();
st.pop();
result.push_back(node->val); // middle
cur = node->right; // right
}
}
return result;
}
};
- 后续遍历(左右中)
前序(中左右)->中右左->reverse()->左右中
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root==nullptr) return result;
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if(node->left!=nullptr) st.push(node->left);
if(node->right!=nullptr) st.push(node->right);
}
reverse(result.begin(), result.end());
return result;
}
};