文章讲解
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
题目链接
/**
* 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 front(TreeNode* cur,vector<int>& res)
{
if(cur==NULL) return ;
res.push_back(cur->val);
front(cur->left,res);
front(cur->right,res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
front(root,ans);
return ans;
}
};
题目链接
/**
* 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 rear(TreeNode* cur,vector<int>& res)
{
if(cur==NULL) return;
rear(cur->left,res);
rear(cur->right,res);
res.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
rear(root,ans);
return ans;
}
};
题目链接
/**
* 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 mid(TreeNode* cur,vector<int>& res)
{
if(cur==NULL) return;
mid(cur->left,res);
res.push_back(cur->val);
mid(cur->right,res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
mid(root,ans);
return ans;
}
};
文章讲解
题目链接
/**
* 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<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
if(root!=NULL)
{
q.push(root);
}
vector<vector<int>> ans;
while(!q.empty())
{
int k=q.size();
vector<int> res;
while(k--)
{
TreeNode* node=q.front();
q.pop();
res.push_back(node->val);
if(node->left!=NULL) q.push(node->left);
if(node->right!=NULL) q.push(node->right);
}
ans.push_back(res);
res.clear();
}
return ans;
}
};
题目链接
将结果reverse一下即可
/**
* 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<vector<int>> levelOrderBottom(TreeNode* root) {
queue<TreeNode*> q;
if(root) q.push(root);
vector<vector<int>> ans;
while(!q.empty())
{
int k=q.size();
vector<int> res;
while(k--)
{
TreeNode* node=q.front();
q.pop();
res.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
ans.push_back(res);
res.clear();
}
reverse(ans.begin(),ans.end());
return ans;
}
};
题目链接
/**
* 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> rightSideView(TreeNode* root) {
queue<TreeNode*> q;
if(root) q.push(root);
vector<int> res;
bool flag=false;
while(!q.empty())
{
int k=q.size();
while(k--)
{
TreeNode* node=q.front();
q.pop();
if(k==0) res.push_back(node->val);//插入每行的最后一个元素
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return res;
}
};
题目链接
/**
* 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<double> averageOfLevels(TreeNode* root) {
queue<TreeNode*> q;
if(root) q.push(root);
vector<double> res;
while(!q.empty())
{
int k=q.size();
double ans=0;
for(int i=0;i<k;i++)
{
TreeNode* node=q.front();
q.pop();
ans+=node->val;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
res.push_back(ans/k);
}
return res;
}
};
题目链接
/*
// Definition for a Node.
class Node {
public:
int val;
vector children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
queue<Node*> q;
if(root!=NULL)
{
q.push(root);
}
vector<vector<int>> ans;
while(!q.empty())
{
int k=q.size();
vector<int> res;
while(k--)
{
Node* node=q.front();
q.pop();
res.push_back(node->val);
for(int i=0;i<node->children.size();i++)
{
if(node->children[i]) q.push(node->children[i]);
}
}
ans.push_back(res);
res.clear();
}
return ans;
}
};
题目链接
/**
* 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> largestValues(TreeNode* root) {
queue<TreeNode*> q;
if(root) q.push(root);
vector<int> res;
while(!q.empty())
{
int k=q.size();
int ans=INT_MIN;
for(int i=0;i<k;i++)
{
TreeNode* node=q.front();
q.pop();
ans=max(ans,node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
res.push_back(ans);
}
return res;
}
};
题目链接
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> q;
if(root) q.push(root);
vector<int> res;
while(!q.empty())
{
int k=q.size();
Node* node=new Node();
Node* prenode=new Node();
for(int i=0;i<k;i++)
{
if(i==0)
{
prenode=q.front();
q.pop();
node=prenode;
}
else{
node=q.front();
prenode->next=node;
q.pop();
prenode=node;
}
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return root;
}
};
题目链接
代码和上一个题一样的 区别在于是不是满二叉树
题目链接
/**
* 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:
int maxDepth(TreeNode* root) {
queue<TreeNode*> q;
if(root) q.push(root);
vector<int> res;
int ans=0;
while(!q.empty())
{
int k=q.size();
for(int i=0;i<k;i++)
{
TreeNode* node=q.front();
q.pop();
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
ans++;
}
return ans;
}
};
题目链接
/**
* 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:
int minDepth(TreeNode* root) {
queue<TreeNode*> q;
if(root) q.push(root);
vector<int> res;
int ans=0;
while(!q.empty())
{
int k=q.size();
ans++;
for(int i=0;i<k;i++)
{
TreeNode* node=q.front();
q.pop();
if(!node->left&&!node->right) return ans;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return ans;
}
};