1. 递归法
1.1 二叉树前序遍历:144. 二叉树的前序遍历 - 力扣(LeetCode)
python3
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def dfs(self, node, res):
if not node:
return
res.append(node.val)
self.dfs(node.left, res)
self.dfs(node.right, res)
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
self.dfs(root, res)
return res
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
#include <vector>
using namespace std;
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
dfs(root, res);
return res;
}
void dfs(TreeNode *node, vector<int>& res) {
if (node == NULL) {
return;
}
res.push_back(node->val);
dfs(node->left, res);
dfs(node->right, res);
}
};
1.2 中序遍历:94. 二叉树的中序遍历 - 力扣(LeetCode)
python3
class Solution:
def dfs(self, node, res):
if not node:
return
self.dfs(node.left, res)
res.append(node.val)
self.dfs(node.right, res)
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
self.dfs(root, res)
return res
C++
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
dfs(root, res);
return res;
}
void dfs(TreeNode* node, vector<int>& res) {
if (node == NULL) {
return;
}
dfs(node->left, res);
res.push_back(node->val);
dfs(node->right, res);
}
};
1.3 后序遍历:145. 二叉树的后序遍历 - 力扣(LeetCode)
python3
class Solution:
def dfs(self, node, res):
if not node:
return
self.dfs(node.left, res)
self.dfs(node.right, res)
res.append(node.val)
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
self.dfs(root, res)
return res
C++
class Solution {
public:
void dfs(TreeNode* node, vector<int>& res) {
if (node == NULL) {
return;
}
dfs(node->left, res);
dfs(node->right, res);
res.push_back(node->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
dfs(root, res);
return res;
}
};
2. 迭代法
2.1 前序遍历:
python3
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
stack = []
res = []
if not root:
return res
stack.append(root)
while stack:
cur = stack.pop()
res.append(cur.val)
if cur.right:
stack.append(cur.right)
if cur.left:
stack.append(cur.left)
return res
C++
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> res;
if (root == NULL) {
return res;
}
st.push(root);
while (!st.empty()) {
TreeNode* cur = st.top();
st.pop();
res.push_back(cur->val);
if (cur->right) st.push(cur->right);
if (cur->left) st.push(cur->left);
}
return res;
}
};
2.2 中序遍历:94. 二叉树的中序遍历 - 力扣(LeetCode)
若当前节点cur非空,cur入栈,访问cur左孩子;若为空,弹出栈顶节点,将栈顶节点值放入res,访问栈顶节点右孩子。
python3
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
stack = []
if not root:
return res
cur = root
while cur or stack:
if cur:
stack.append(cur)
cur = cur.left
else:
cur = stack.pop()
res.append(cur.val)
cur = cur.right
return res
C++
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if (!root) {
return res;
}
TreeNode* cur = root;
while (cur || !st.empty()) {
if (cur) {
st.push(cur);
cur = cur->left;
}
else {
cur = st.top();
st.pop();
res.push_back(cur->val);
cur = cur->right;
}
}
return res;
}
};
2.3 后序遍历:145. 二叉树的后序遍历 - 力扣(LeetCode)
后序迭代类似于前序遍历,将(中,右,左)倒序返回。
python3
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
stack = []
res = []
if not root:
return res
stack.append(root)
while stack:
cur = stack.pop()
res.append(cur.val)
if cur.left:
stack.append(cur.left)
if cur.right:
stack.append(cur.right)
#return list(reversed(res)) #写法一
#return res[::-1] #写法二:list_name[start:end:step], start default=0, end default=len(list_name), step default=1.
#写法三
res.reverse()
return res
C++
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if (!root) return res;
st.push(root);
while (!st.empty()) {
TreeNode* cur = st.top();
st.pop();
res.push_back(cur->val);
if (cur->left) st.push(cur->left);
if (cur->right) st.push(cur->right);
}
reverse(res.begin(), res.end());
return res;
}
};