可参考LeetCode:
| 题号 | 题目 | 链接 |
|---|---|---|
| 144 | Binary Tree Preorder Traversal | https://leetcode.com/problems/binary-tree-preorder-traversal/ |
| 94 | Binary Tree Inorder Traversal | https://leetcode.com/problems/binary-tree-inorder-traversal/ |
| 145 | Binary Tree Postorder Traversal | https://leetcode.com/problems/binary-tree-postorder-traversal/ |
二叉树的前序遍历
// 递归写法
vector<int> res;
vector<int> preorderTraversal(TreeNode* root) {
dfs(root);
return res;
}
void dfs(TreeNode* root){
if (!root) return;
res.push_back(root->val);
dfs(root->left);
dfs(root->right);
}
// 非递归,循环写法
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> stk;
while(stk.size() || root){
while(root){
res.push_back(root->val);
stk.push(root);
root = root-> left;
}
TreeNode* p = stk.top();
stk.pop();
root = p->right;
}
return res;
}
二叉树的中序遍历
// 递归写法
vector<int> res;
vector<int> inorderTraversal(TreeNode* root) {
dfs(root);
return res;
}
void dfs(TreeNode* root){
if (!root) return;
dfs(root->left);
res.push_back(root->val);
dfs(root->right);
}
// 非递归,循环的方法
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> stk;
TreeNode* p = root;
while(stk.size() || p){
while(p){
stk.push(p);
p = p->left;
}
p = stk.top();
res.push_back(p->val);
stk.pop();
p = p->right;
}
return res;
}
二叉树的后序遍历
// 递归写法
vector<int> res;
vector<int> postorderTraversal(TreeNode* root) {
if (!root) return res;
postorderTraversal(root->left);
postorderTraversal(root->right);
res.push_back(root->val);
return res;
}
// 非递归写法
vector<int> res;
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
TreeNode* last = nullptr;
while(stk.size() || root){
while(root){
stk.push(root);
root = root->left;
}
TreeNode* p = stk.top();
if (p->right == nullptr || p->right == last) {
res.push_back(p->val);
stk.pop();
last = p;
}else {
root = p->right;
}
}
return res;
}
本文深入探讨了二叉树的三种遍历方法:前序、中序和后序遍历。提供了递归和非递归实现代码,帮助读者理解不同遍历方式的原理和应用。
1万+

被折叠的 条评论
为什么被折叠?



