二叉树遍历
1.前序、中序、后序遍历
1)144. 二叉树的前序遍历
class Solution {
public:
void preorder(TreeNode* root, vector<int>& res) {
if (root == nullptr) return;
res.push_back(root->val);
preorder(root->left,res);
preorder(root->right, res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
preorder(root, res);
return res;
}
};
- 迭代做法
用栈实现:只要有做儿子就一直往下遍历,放到栈里;从下往上看走过的点有没有右儿子。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> stk;
while (root || stk.size()) {
while (root) {
res.push_back(root->val);
stk.push(root);
root = root->left;
}
root = stk.top();
stk.pop();
root = root->right;
}
return res;
}
};
2)94. 二叉树的中序遍历
class Solution {
public:
void inorder(TreeNode* root, vector<int>& res) {
if (root == nullptr) return;
inorder(root->left,res);
res.push_back(root->val);
inorder(root->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
inorder(root, res);
return res;
}
};
- 迭代做法
前序和中序的差别:前序是先遍历根节点再遍历左子树,中序是先遍历左子树再遍历根节点。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*