LCR 046. 二叉树的右视图 - 力扣(LeetCode)
用t来记录每层节点个数,每次队列第一个数都是最右边的数。
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
if(root==NULL) return {};
queue<TreeNode*>q;
vector<int>v;
q.push(root);
while(!q.empty()){
v.push_back(q.front()->val);
int t=q.size();
while(t--)
{
if(q.front()->right!=NULL)
q.push(q.front()->right);
if(q.front()->left!=NULL)
q.push(q.front()->left);
q.pop();
}
}
return v;
}
};
107. 二叉树的层序遍历 II - 力扣(LeetCode)
这个是上一个的变形,它先左后右,因为从下往上输出,所以翻转一下就行。
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>>v;
if(root==NULL)return v;
queue<TreeNode*>q;
q.push(root);
while(!q.empty())
{
vector<int>v1;
int n=q.size();
while(n--)
{
v1.push_back(q.front()->val);
if(q.front()->left!=NULL)q.push(q.front()->left);
if(q.front()->right!=NULL)q.push(q.front()->right);
q.pop();
}
v.push_back(v1);
}
reverse(v.begin(),v.end());
return v;
}
};
103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)
这个是上一题变体,从左往右从右往左输出,来回交替,只需要加个int记录,奇数层原样,偶数层翻转一下。
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>>v;
if(root==NULL)return v;
queue<TreeNode*>q;
q.push(root);
int t=0;
while(!q.empty())
{
int n=q.size();
vector<int>v1;
while(n--)
{
v1.push_back(q.front()->val);
if(q.front()->left!=NULL)q.push(q.front()->left);
if(q.front()->right!=NULL)q.push(q.front()->right);
q.pop();
}
t++;
if(t%2==0)reverse(v1.begin(),v1.end());
v.push_back(v1);
}
return v;
}
};
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>>v;
if(root==NULL)return v;
queue<TreeNode*>q;
q.push(root);
while(!q.empty())
{
vector<int>v1;
int n=q.size();
while(n--)
{
v1.push_back(q.front()->val);
if(q.front()->left!=NULL)q.push(q.front()->left);
if(q.front()->right!=NULL)q.push(q.front()->right);
q.pop();
}
v.push_back(v1);
}
return v;
}
};
LCR 153. 二叉树中和为目标值的路径 - 力扣(LeetCode)
用前序遍历遍历所有路径,每遍历一个节点target=target-节点的值,把当前节点值存入path,
满足条件的路径应该是当前节点是叶子节点且target=0,递归左右节点,回溯,把当前节点弹出。
class Solution {
public:
vector<vector<int>> pathTarget(TreeNode* root, int target) {
road(root,target);
return v;
}
vector<vector<int>>v;
vector<int>path;
void road(TreeNode* root,int t)
{
if(root==NULL)return;
t-=root->val;
path.push_back(root->val);
if(t==0 && root->left==NULL && root->right==NULL)
{
v.push_back(path);
}
road(root->left,t);
road(root->right,t);
path.pop_back();
}
};
LCR 051. 二叉树中的最大路径和 - 力扣(LeetCode)
写个递归,来算每个节点的最大贡献值,一个节点的最大贡献值是它自己的值+max(左孩子贡献值,右孩子贡献值),叶子节点贡献值就是他们本身的值,最大路径的和=当前结点的值+左孩子最大贡献值+右孩子最大贡献值。
class Solution {
public:
int maxnum=INT_MIN;
int maxPathSum(TreeNode* root) {
maxans(root);
return maxnum;
}
int maxans(TreeNode* root)
{
if(root==NULL)return 0;
int leftw=max(maxans(root->left),0);
int rightw=max(maxans(root->right),0);
int newpath=root->val+leftw+rightw;
maxnum=max(maxnum,newpath);
return root->val+max(leftw,rightw);
}
};