层序遍历
v1.0:迭代法 核心思路是每层统计队列大小,按这个大小pop,然后push子节点
/**
* 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) {
vector<vector<int>> result;
if(root==nullptr)return result;
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int size = q.size();
vector<int> tmp;
TreeNode * cur;
while(size--)
{
cur = q.front();
tmp.push_back(cur->val);
q.pop();
if(cur->left)q.push(cur->left);
if(cur->right)q.push(cur->right);
}
result.push_back(tmp);
}
return result;
}
};
v2.0:递归法 是使用数组表示的树,使用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 {
public:
void traversal(vector<vector<int>> &ret, TreeNode*cur, int depth)
{
if(cur==nullptr)return;
if(ret.size()==depth)ret.push_back(vector<int>());
ret[depth].push_back(cur->val);
traversal(ret, cur->left, depth+1);
traversal(ret, cur->right, depth+1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if(root==nullptr)return result;
int depth = 0;
traversal(result, root, depth);
return result;
}
};
107. 二叉树的层序遍历 II - 力扣(LeetCode)
v1.0 递归法 很简单,正常层序遍历之后将result反转即可
/**
* 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 traversal(vector<vector<int>> &result, TreeNode*cur, int depth)
{
if(cur==nullptr)return;
if(depth==result.size())result.push_back(vector<int>());
result[depth].push_back(cur->val);
traversal(result, cur->left, depth+1);
traversal(result, cur->right, depth+1);
}
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> result;
if(root==nullptr)return result;
int depth=0;
traversal(result, root, depth);
reverse(result.begin(), result.end());
return result;
}
};
v2.0 : 迭代法 使用队列 通过队列的尺寸来限制下一次读的次数,注意要保持队列里面不能有空指针
/**
* 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) {
vector<vector<int>> result;
if(root==nullptr)return result;
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int n = q.size();
vector<int> tmp;
for(int i = 0; i <n;i++)
{
TreeNode *cur = q.front();
tmp.push_back(cur->val);
q.pop();
if(cur->left)q.push(cur->left);
if(cur->right)q.push(cur->right);
}
result.push_back(tmp);
}
reverse(result.begin(), result.end());
return result;
}
};
v1.0: 迭代法,取每一行最后一个即可,注意不能舍弃左子树
/**
* 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) {
vector<int> result;
if(root==nullptr)return result;
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int size = q.size();
for(int i = 0; i< size; i++)
{
TreeNode *cur = q.front();
if(i==size-1)result.push_back(cur->val);
q.pop();
if(cur->left)q.push(cur->left);
if(cur->right)q.push(cur->right);
}
}
return result;
}
};
v2.0:递归法
/**
* 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 traversal(vector<vector<int>> &treeNodes, TreeNode* cur, int depth)
{
if(cur==nullptr)return;
if(treeNodes.size()==depth)treeNodes.push_back(vector<int>());
treeNodes[depth].push_back(cur->val);
traversal(treeNodes, cur->left, depth+1);
traversal(treeNodes, cur->right, depth+1);
}
vector<int> rightSideView(TreeNode* root) {
vector<int> result;
vector<vector<int>> treeNodes;
if(root==nullptr)return result;
int depth = 0;
traversal(treeNodes, root, depth);
for(auto v:treeNodes)
{
result.push_back(v[v.size()-1]);
}
return result;
}
};
v1.0 : 递归法 得到treeNodes后 再对treeNodes的每个元素取均值
/**
* 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 traversal(vector<vector<int>> &treeNodes, TreeNode * cur, int depth)
{
if(cur==nullptr)return;
if(treeNodes.size()==depth)treeNodes.push_back(vector<int>());
treeNodes[depth].push_back(cur->val);
traversal(treeNodes, cur->left, depth + 1);
traversal(treeNodes, cur->right, depth + 1);
}
vector<double> averageOfLevels(TreeNode* root) {
vector<double> result;
if(root==nullptr)return result;
int depth = 0;
vector<vector<int>> treeNodes;
traversal(treeNodes, root, depth);
for(auto v:treeNodes)
{
double sum = 0;
double count = 0;
for(int i:v)
{
sum += i;
count++;
}
result.push_back(sum / count);
}
return result;
}
};
v2.0: 迭代法
v1.0:迭代法 一遍过~
/*
// 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) {
vector<vector<int>> treeNodes;
if(root==nullptr)return treeNodes;
queue<Node*> q;
q.push(root);
int depth = 0;
while(!q.empty())
{
int size = q.size();
treeNodes.push_back(vector<int>());
for(int i = 0; i< size; i++)
{
Node* cur = q.front();
q.pop();
treeNodes[depth].push_back(cur->val);
for(auto c:cur->children)
{
q.push(c);
}
}
depth++;
}
return treeNodes;
}
};
515. 在每个树行中找最大值 - 力扣(LeetCode)
v1.0:递归法 注意int的最小值:INT_MIN -2147483648
/**
* 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 traversal(vector<vector<int>> &treeNodes, TreeNode *cur, int depth)
{
if(cur==nullptr)return;
if(treeNodes.size()==depth)treeNodes.push_back(vector<int>());
treeNodes[depth].push_back(cur->val);
traversal(treeNodes, cur->left, depth+1);
traversal(treeNodes, cur->right, depth+1);
}
vector<int> largestValues(TreeNode* root) {
vector<vector<int>> treeNodes;
if(root==nullptr)return vector<int>();
int depth = 0;
traversal(treeNodes, root, depth);
vector<int> result(treeNodes.size(), INT_MIN);
for(int i = 0; i <treeNodes.size();i++)
{
for(auto e:treeNodes[i])
{
if(e>result[i])result[i]=e;
}
}
return result;
}
};
116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)
v1.0:迭代法
/*
// 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) {
if(root==nullptr)return root;
queue<Node*> q;
q.push(root);
while(!q.empty())
{
int size = q.size();
for(int i = 0; i<size; i++)
{
Node* cur = q.front();
q.pop();
if(i!=size - 1)cur->next = q.front();
if(cur->left)q.push(cur->left);
if(cur->right)q.push(cur->right);
}
}
return root;
}
};
v2.0:递归法
/*
// 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:
void traversal(Node* cur, vector<vector<Node*>>& treeNodes, int depth)
{
if(cur==nullptr)return;
if(treeNodes.size()==depth)treeNodes.push_back(vector<Node*>());
treeNodes[depth].push_back(cur);
traversal(cur->left, treeNodes, depth+1);
traversal(cur->right, treeNodes, depth+1);
}
Node* connect(Node* root) {
vector<vector<Node*>> treeNodes;
if(root==nullptr)return root;
int depth = 0;
traversal(root, treeNodes, depth);
for(int i = 0; i < treeNodes.size();i++)
{
for(int j = 0; j < treeNodes[i].size()-1;j++)
{
treeNodes[i][j]->next = treeNodes[i][j+1];
}
}
return root;
}
};
v1.0:迭代法
/**
* 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) {
int max_depth = 0;
if(root==nullptr)return max_depth;
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int size = q.size();
if(size > 0)max_depth++;
for(int i = 0; i < size; i++)
{
TreeNode* cur = q.front();
q.pop();
if(cur->left)q.push(cur->left);
if(cur->right)q.push(cur->right);
}
}
return max_depth;
}
};
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
v1.0:递归法
/**
* 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 min_depth = INT_MAX;
void traversal(vector<vector<TreeNode*>>& treeNodes, TreeNode* cur, int depth)
{
if(cur==nullptr)return;
if(treeNodes.size()==depth)treeNodes.push_back(vector<TreeNode*>());
treeNodes[depth].push_back(cur);
if(cur->left==nullptr && cur->right==nullptr &&depth<min_depth)min_depth = depth+1;
traversal(treeNodes, cur->left, depth+1);
traversal(treeNodes, cur->right, depth+1);
}
int minDepth(TreeNode* root) {
if(root==nullptr)return 0;
vector<vector<TreeNode*>> treeNodes;
int depth = 0;
traversal(treeNodes, root, depth);
return min_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 {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr)return root;
stack<TreeNode*> s;
s.push(root);
while(!s.empty())
{
TreeNode* cur = s.top();
s.pop();
auto tmp = cur->left;
cur->left = cur->right;
cur->right = tmp;
if(cur->left)s.push(cur->left);
if(cur->right)s.push(cur->right);
}
return root;
}
};
void traversal(TreeNode* cur)
{
if (cur == nullptr)
return;
TreeNode* tmp = cur->left;
cur->left = cur->right;
cur->right = tmp;
traversal(cur->left);
traversal(cur->right);
}
TreeNode* mirrorTree(TreeNode* root) {
traversal(root);
return root;
}
对称二叉树
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==nullptr)return false;
queue<TreeNode*> q;
TreeNode* u = root;
TreeNode* v = root;
q.push(u);
q.push(v);
while(!q.empty())
{
u = q.front();
q.pop();
v = q.front();
q.pop();
if (!u && !v) continue;
if((!u || !v) || (u->val!=v->val))return false;
q.push(u->left);
q.push(v->right);
q.push(u->right);
q.push(v->left);
}
return true;
}
};
bool traversal(TreeNode* u, TreeNode* v)
{
if (!u && !v)
return true;
if (!u || !v)
return false;
if (u->val == v->val)
return traversal(u->left, v->right) && traversal(u->right, v->left);
return false;
}
bool isSymmetric(TreeNode* root) {
return traversal(root, root);
}