手写代码的的数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。
链表的定义:
struct ListNode{
int val;
ListNode*next;
ListNode(int x):
val(x),next(NULL)
{}
};
二叉树的定义:
struct TreeNode{
int val;
TreeNode*left;
TreeNode*
}
好了 进入二叉树的训练:
1.递归
递归三部曲:
1.参数和返回值
2.终止条件
3.单层递归逻辑
以前序遍历为例:
void traversal(TreeNode* cur, vector<int>& vec)//1
if (cur == NULL) return;//2
vec.push_back(cur->val);//3
traversal(cur->left, vec);
traversal(cur->right, vec);
2.迭代法:
先来个前序遍历的:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*>st;
vector<int>result;
if(root==nullptr)return result;
st.push(root);
while(!st.empty()){
auto 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;
}
};
后序的超级简单 reverse就行
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*>stk;
vector<int>result;
if(root==nullptr)return result;
stk.push(root);
while(!stk.empty()){
auto node=stk.top();
stk.pop();
result.push_back(node->val);
if(node->left)stk.push(node->left);
if(node->right)stk.push(node->right);
}
reverse(result.begin(),result.end());
return result;
}
};
中序好好记一下:就是说stk和vector都还要
但是呢 弄个cur cur不是空 或者栈不是空 就可以看看
如果cur不是空的话 可以入栈 然后往左一个
如果cur是空的了 那可以对栈top进行操作 并且往右一个
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*>stk;
vector<int>result;
auto cur=root;
while(!stk.empty()||cur!=nullptr){
if(cur!=nullptr){
stk.push(cur);
cur=cur->left;
}else{
cur=stk.top();
stk.pop();
result.push_back(cur->val);
cur=cur->right;
}
}
return result;
}
};