可参考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;
}