力扣刷题DAY16(二叉树+迭代遍历)
一、前序遍历
前序:中左右
144. 二叉树的前序遍历
动态过程图示
/*** 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) {}* };*/
class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> temp;vector<int> res;if (root == nullptr) // 空数return res;temp.push(root);while (!temp.empty()) {TreeNode* t = temp.top();temp.pop(); // 取栈顶res.push_back(t->val); // 读栈顶,更新resif (t->right != nullptr) // 处理右孩子,先进后出temp.push(t->right);if (t->left != nullptr) // 处理左孩子,后进先出temp.push(t->left);}return res;}
};
复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(n)。
易错点:
注意空树的情况,如果不单独判断,会导致nullptr进栈,会出现 Line 23: Char 30: runtime error: member access within null pointer of type 'TreeNode' (solution.cpp)。
二、后序遍历
145. 二叉树的后序遍历
/*** 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) {}* };*/
class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> temp;vector<int> res;if (root == nullptr) // 空数return res;temp.push(root);while (!temp.empty()) {TreeNode* t = temp.top();temp.pop(); // 取栈顶res.push_back(t->val); // 读栈顶,更新resif (t->left != nullptr) // 处理左孩子,后进先出temp.push(t->left);if (t->right != nullptr) // 处理右孩子,先进后出temp.push(t->right);} // 到这儿,是中右左reverse(res.begin(), res.end()); // 翻转res:左右中return res;}
};
复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(n)。
三、中序遍历
94. 二叉树的中序遍历
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;TreeNode* node = root;while (node != nullptr || !st.empty()) {// 一路向左走到底while (node != nullptr) {st.push(node);node = node->left;}// 弹出栈顶,访问当前节点node = st.top();st.pop();res.push_back(node->val); // 中// 转向右子树node = node->right;}return res;}
};
复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(n)。
思路解析:
先一路向左(第二层while),直到没有左子树需要处理了,那就要处理“中”,此时的中其实也就是栈顶,读取然后出栈。然后转向右孩子,然后再一路向左,也就是回到刚开始(第一层while)。
关于第一层的两个条件: