今日任务:理论基础;递归遍历 ;迭代遍历;统一迭代
卡哥建议:
重点:
参考链接:代码随想录:代码随想录 (programmercarl.com)
理论基础
题目讲解(全):代码随想录
题目建议:需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
视频讲解:
关于二叉树,你该了解这些! (opens new window)
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
递归遍历
题目讲解(全):代码随想录
题目建议:二叉树的三种递归遍历掌握其规律后,其实很简单 (必须掌握)
刷题链接:144.二叉树的前序遍历
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:
//后序遍历
void traversal(TreeNode* cur,vector<int>& vec){
if(cur == NULL) return;
//左右中
traversal(cur->left,vec);
traversal(cur->right,vec);
vec.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root,result);
return result;
}
};
class Solution {
public:
//中序遍历
void traversal(TreeNode* cur,vector<int>& vec){
if(cur == NULL) return;
//左中右
traversal(cur->left,vec);
vec.push_back(cur->val);
traversal(cur->right,vec);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root,result);
return result;
}
};
视频讲解:
每次写递归都要靠直觉? 这次带你学透二叉树的递归遍历! (opens new window)
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
迭代遍历
题目讲解(全):代码随想录
题目建议:基础不好的录友,迭代法可以放过
刷题链接:同上--三个
前序遍历:
class Solution {
public:
//前序遍历---中左右----迭代遍历
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root == NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* node=st.top();
st.pop();
result.push_back(node->val);
if(node->right) st.push(node->right);//先入栈-后出
if(node->left) st.push(node->left);
}
return result;
}
};
中序遍历:
class Solution {
public:
//中序遍历----迭代遍历--左中右
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root==NULL) return result;
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;
}
};
后序遍历:
class Solution {
public:
//后序遍历--迭代遍历---左右中
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root==NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* node =st.top();
st.pop();
result.push_back(node->val);
if(node->left)st.push(node->left);//先左进,后出;
if(node->right)st.push(node->right);
}
reverse(result.begin(),result.end());
return result;
}
};
写出二叉树的非递归遍历很难么?(中序)) (opens new window)
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
统一迭代
题目讲解(全):代码随想录
题目建议:基础不好的录友,迭代法可以放过
刷题链接:同上
中序遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root != NULL) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
//每次都是在中后面加入NULL---进行判断-----
//倒叙--先入栈-后出栈--
if (node != NULL) {
st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中
if (node->right) st.push(node->right); // 添加右节点(空节点不入栈)
st.push(node); // 添加中节点
st.push(NULL); // 中节点访问过,但是还没有处理,加入空节点做为标记。
if (node->left) st.push(node->left); // 添加左节点(空节点不入栈)
} else { // 只有遇到空节点的时候,才将下一个节点放进结果集
st.pop(); // 将空节点弹出
node = st.top(); // 重新取出栈中元素
st.pop();
result.push_back(node->val); // 加入到结果集
//result.push_backst.top()->val);,然后在pop()
}
}
return result;
}
};
前序遍历:
class Solution {
public:
//前序遍历---中左右----迭代遍历
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root!=NULL) st.push(root);
while(!st.empty()){
TreeNode* node=st.top();
if(node!= NULL){
st.pop();
if(node->right)st.push(node->right);
if(node->left)st.push(node->left);
st.push(node);
st.push(NULL);
}
else {
st.pop();
result.push_back(st.top()->val);
st.pop();
}
}
return result;
}
};
后序遍历:
class Solution {
public:
//后序遍历--迭代遍历---左右中
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root!=NULL) st.push(root);
while(!st.empty()){
TreeNode* node=st.top();
if(node!= NULL){
st.pop();
st.push(node);
st.push(NULL);
if(node->right)st.push(node->right);
if(node->left)st.push(node->left);
}
else {
st.pop();
result.push_back(st.top()->val);
st.pop();
}
}
return result;
}
};
视频讲解:
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
今日收获,记录一下自己的学习时长:
优质文章:学习参考: