代码随想录刷题02.26
二叉树相关操作1——遍历
LeetCode题目:
解题思路
!!!递归3步骤:
1)确定递归函数的参数值:画出堆栈图,明确每个栈帧函数内的变量参数以及传递值和返回值;
2)确定终止条件:想象最后一个节点的情况;
3)确定单层递归体的逻辑:想象任意一个中间节点;若返回值为void,则不需要定义变量承接;若返回值
是void,则需要定义变量承接。
代码过程
/**
* 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> travel(TreeNode* root,vector<int>vec){
if(root==NULL)return vec;
vec.push_back(root->val);
vec=travel(root->left,vec);
vec=travel(root->right,vec);
return vec;
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int>result;
return travel(root,result);
}
};
LeetCode题目
解题思路
经验:
递归参数的继承主要有2种方式:1)自身等于返回值;2)添加引用;
但要注意,思考递归参数时,当单个递归体中含有两个方向的动力时,要思考递归参数能否继承下来。
代码过程
/**
* 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:
void travel(TreeNode*root,vector<int>&vec){
if(root==NULL){
return;
}
travel(root->left,vec);
travel(root->right,vec);
vec.push_back(root->val);
return;
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int>result;
travel(root,result);
return result;
}
};
LeetCode题目
解题思路
迭代法:
二叉树的迭代遍历法要结合另外的数据结构如stack\queue来进行,这样可以起到一个数据“缓存”的效果;
要注意,设计进出stack/queue的策略。
代码过程
/**
* 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> inorderTraversal(TreeNode* root) {
stack<TreeNode*>st;
vector<int>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;
}
};