学习目标:
- 二叉树递归遍历
- 二叉树迭代遍历
- 二叉树统一迭代
学习内容:
二叉树递归遍历
//前序遍历
class Solution {
public:
//确定递归函数的参数和返回值
void traversal(TreeNode* cur, vector<int>& vec) {
// 确定终止条件
if (cur == NULL) return;
// 确定单层递归的逻辑
vec.push_back(cur->val); // 中
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
错误以及注意事项
- 前中后序递归遍历逻辑相似,不再赘述。
二叉树迭代遍历
前序遍历
//前序遍历
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
vector<int> res;
if(root == NULL) return res;
stk.push(root);
while(!stk.empty()){
TreeNode* node = stk.top();
stk.pop();
res.push_back(node->val);
if(node->right) stk.push(node->right);
if(node->left) stk.push(node->left);
}
return res;
}
};
错误以及注意事项
- 前序遍历中为什么要先加入 右孩子,再加入左孩子呢? 因为这样出栈的时候才是中左右的顺序。
后序遍历
//后序遍历
// 可以注意到将前序遍历中的左右 进行交换后,顺序变成了中右左。最后进行reverse,则为后序遍历 左右中
class Solution
{
public:
vector<int> postorderTraversal(TreeNode *root)
{
stack<TreeNode *> stk;
vector<int> result;
if (root == NULL)
return result;
stk.push(root);
while (!stk.empty())
{
TreeNode *node = stk.top();
stk.pop();
result.push_back(node->val);
if (node->left != NULL)
stk.push(node->left);
if (node->right != NULL)
stk.push(node->right);
}
reverse(result.begin(), result.end());
return result;
}
};
中序遍历
class Solution
{
public:
vector<int> inorderTraversal(TreeNode *root)
{
vector<int> result;
stack<TreeNode *> st;
TreeNode *cur = root;
while (cur != NULL || !st.empty())
{
if (cur != NULL)
{
st.push(cur);
cur = cur->left;
}
else
{
cur = st.top();
st.pop();
result.push_back(cur->val);
cur = cur->right;
}
}
return result;
}
};
错误以及注意事项
- 没太搞懂中序迭代。
学习时间:
2023.12.13 16:00-16:40