代码随想录刷题02.27
二叉树相关操作2
LeetCode题目
解题思路
1.迭代法:
1)二叉树的迭代遍历要依赖栈/队列等数据结构,并且迭代过程也是针对的栈/队列这些数据结构;
2)本题的思路是根节点出栈时向队列中入子节点;
3)注意剪枝情况,当根节点为空时,要避开操作node->right这类操作。
2.递归法:
1)本体的递归思路:
i)共三个形参,root、depth和二维动态数组result,其中,向上传递root、depth,所需要的result一直
存结果;
ii)终止边界条件仍然是当节点root==nullptr时;
iii)当result.size()==depth时,向result数组中加入空的一维数组,否则将对应的节点数据存
result[depth]中。
代码过程
/**
* 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 {
void order(TreeNode* root,vector<vector<int>>&result,int depth){
if(root==nullptr)return;
if(result.size()==depth)result.push_back(vector<int>());
result[depth].push_back(root->val);
order(root->left,result,depth+1);
order(root->right,result,depth+1);
}
public:
vector<vector<int>> levelOrder(TreeNode* root) {
int depth=0;
vector<vector<int>>result;
order(root,result,depth);
return result;
/*queue<TreeNode*>que;
vector<vector<int>>result;
que.push(root);
while(!que.empty())
{
int size=que.size();
vector<int>vec;
while(size--)
{
TreeNode* node=que.front();
que.pop();
if(node==nullptr)continue;
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
vec.push_back(node->val);
}
if(vec.empty())continue;
result.push_back(vec);
}
return result;*/
}
};
LeetCode题目
解题思路
代码过程
/**
* 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*>que;
vector<vector<int>>result;
if(root==nullptr)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
vector<int>vec;
while(size--)
{
TreeNode* node=que.front();
que.pop();
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
vec.push_back(node->val);
}
result.push_back(vec);
}
reverse(result.begin(),result.end());
return result;
}
};
LeetCode题目
解题思路
代码过程
/**
* 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*>que;
vector<int>result;
if(root==nullptr)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
vector<int>vec;
while(size--)
{
TreeNode* node=que.front();
que.pop();
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
vec.push_back(node->val);
}
result.push_back(*(vec.end()-1));
}
return result;
}
};
LeetCode题目
解题思路
代码过程
/**
* 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*>que;
vector<double>result;
if(root==nullptr)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
double sum=0.0;
for(int i=0;i<size;i++)
{
TreeNode* node=que.front();
que.pop();
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
sum+=node->val;
}
result.push_back(sum/size);
}
return result;
}
};
LeetCode题目
解题思路
**小tips:*构造N叉树,可以把子节点地址存储到一个数组vector<Node>中。
代码过程
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
queue<Node*>que;
vector<vector<int>>result;
if(root==nullptr)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
vector<int>vec;
while(size--)
{
Node* node=que.front();
que.pop();
vec.push_back(node->val);
for(int i=0;i<(node->children.size());i++)
{
if(node->children[i]!=nullptr)
que.push(node->children[i]);
}
}
result.push_back(vec);
}
return result;
}
};
LeetCode题目
解题思路
1.找到一个最小值(而不是给整个数列排序的话)可以额外设置一个变量,将变量与数列中数进行比较即可;
2.表示最小值:INT_MIN;表示最大值:INT_MAX
代码过程
/**
* 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*>que;
vector<int>result;
if(root==NULL)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
int resultmax=INT_MIN;
while(size--)
{
TreeNode* node=que.front();
que.pop();
resultmax=resultmax>node->val?resultmax:node->val;
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
}
result.push_back(resultmax);
}
return result;
}
};
LeetCode题目
解题思路
要点:抓住queue的出队和进队来分析
代码过程
/*
// 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*>que;
if(root==NULL)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
for(int i=0;i<size;i++)
{
Node* node=que.front();
que.pop();
if(i==(size-1))node->next=nullptr;
else node->next=que.front();
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
}
}
return root;
}
};
LeetCode题目
解题思路
代码过程
/*
// 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*>que;
if(root==NULL)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
for(int i=0;i<size;i++)
{
Node* node=que.front();
que.pop();
if(i==(size-1))node->next=nullptr;
else node->next=que.front();
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
}
}
return root;
}
};
LeetCode题目
解题思路
代码过程
/**
* 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*>que;
int count=0;
if(root==NULL)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
int resultmax=INT_MIN;
while(size--)
{
TreeNode* node=que.front();
que.pop();
resultmax=resultmax>node->val?resultmax:node->val;
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
}
count++;
}
return count;
}
};
LeetCode题目
解题思路
代码过程
/**
* 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*>que;
int count=0;
if(root==NULL)return{};
que.push(root);
while(!que.empty())
{
int size=que.size();
count++;
while(size--)
{
TreeNode* node=que.front();
que.pop();
if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
if(node->left==nullptr&&node->right==nullptr)return count;
}
}
return count;
}
};
LeetCode题目
解题思路
1.针对本题,无论是递归法还是迭代法,都是要“拿出1个节点,然后用swap函数反转其子节点”;
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:
TreeNode* invertTree(TreeNode* root) {
//递归法
if(root==nullptr)return root;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
//迭代法
/*stack<TreeNode*>st;
if(root==NULL)return root;
st.push(root);
while(!st.empty())
{
int size=st.size();
while(size--)
{
TreeNode*node=st.top();
swap(node->left,node->right);
st.pop();
if(node->left)st.push(node->left);
if(node->right)st.push(node->right);
}
}
return root;*/
}
};
LeetCode题目
解题思路
递归书写思路:
1)形参如何确定:需要确定输入形参和返回形参,可能需要多次调试;
2)终止条件如何写:排除上一层终止条件即可进入下一层;
3)递归体如何书写:进入子层(二叉树里面就是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:
bool travel(TreeNode*left,TreeNode*right)
{
if(left==nullptr&&right==nullptr)return true;
else if(left==nullptr&&right!=nullptr)return false;
else if(left!=nullptr&&right==nullptr)return false;
else if(left->val!=right->val)return false;
else{
bool outside=travel(left->right,right->left);
bool inside=travel(left->left,right->right);
bool result=outside&&inside;
return result;
}
}
bool isSymmetric(TreeNode* root) {
bool result=travel(root->left,root->right);
return result;
}
};