1.二叉树的递归遍历和迭代遍历
1.1 题目
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
1.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:
void preTraversal(TreeNode* root, vector<int>& vec)
{
if (root == nullptr)return;
//中
vec.push_back(root->val);
//左
preTraversal(root->left,vec);
//右
preTraversal(root->right,vec);
}
vector<int> preorderTraversal(TreeNode* root)
{
vector<int> vec;
preTraversal(root,vec);
return vec;
}
};
/**
* 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 preTraversal(TreeNode* root, vector<int>& vec)
{
if (root == nullptr)return;
//左
preTraversal(root->left,vec);
//右
preTraversal(root->right,vec);
//中
vec.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root)
{
vector<int> vec;
preTraversal(root,vec);
return vec;
}
};
/**
* 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 preTraversal(TreeNode* root, vector<int>& vec)
{
if (root == nullptr)return;
//左
preTraversal(root->left,vec);
//中
vec.push_back(root->val);
//右
preTraversal(root->right,vec);
}
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> vec;
preTraversal(root,vec);
return vec;
}
};
1.3 题解二(迭代遍历)
/**
* 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> preorderTraversal(TreeNode* root)
{
vector<int> vec;
stack<TreeNode*> sta;
if (root == nullptr)return vec;
sta.push(root);
while (!sta.empty())
{
//中
TreeNode* tmp = sta.top();
sta.pop();
vec.push_back(tmp->val);
//空节点不入栈
//先放右节点,因为从栈弹出来是先进后出
if (tmp->right) sta.push(tmp->right);
//再放左节点
if (tmp->left)sta.push(tmp->left);
}
return vec;
}
};
/**
* 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> postorderTraversal(TreeNode* root)
{
vector<int> result;
stack<TreeNode*> st;
if (root == nullptr)return result;
st.push(root);
while (!st.empty())
{
//中
TreeNode* rootValue = st.top();
st.pop();
result.push_back(rootValue->val);
//左
if (rootValue->left != nullptr)st.push(rootValue->left);
//右
if (rootValue->right != nullptr)st.push(rootValue->right);
}
reverse(result.begin(), result.end());
return 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:
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> result;
//每次遍历的节点都要入栈
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur!=nullptr||!st.empty())
{
if (cur != nullptr)
{
st.push(cur);
cur = cur->left;
}
else
{
cur = st.top();
st.pop();
result.push_back(cur->val);
cur = cur->right;
}
}
return result;
}
};
2.二叉树的层序遍历
2.1 题目
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
. - 力扣(LeetCode)
2.1 题解
/**
* 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;
queue<TreeNode*> q;
if (root!=nullptr)q.push(root);
while (!q.empty())
{
vector<int> vec;
int size = q.size();
while (size--)
{
TreeNode* tmp = q.front();
q.pop();
vec.push_back(tmp->val);
if (tmp->left)q.push(tmp->left);
if (tmp->right)q.push(tmp->right);
}
result.push_back(vec);
}
return 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:
vector<vector<int>> levelOrderBottom(TreeNode* root)
{
vector<vector<int>> result;
queue<TreeNode*> q;
if (root != nullptr)q.push(root);
while (!q.empty())
{
vector<int> vec;
int size = q.size();
while (size--)
{
auto tmp = q.front();
q.pop();
vec.push_back(tmp->val);
if (tmp->left != nullptr)q.push(tmp->left);
if (tmp->right != nullptr)q.push(tmp->right);
}
result.push_back(vec);
}
reverse(result.begin(), result.end());
return result;
}
};
class Solution
{
public:
vector<int> rightSideView(TreeNode* root)
{
vector<int> result;
queue<TreeNode*> q;
if (root != nullptr)q.push(root);
while (!q.empty())
{
int size = q.size();
for (int i = 0; i < size; i++)
{
auto tmp = q.front();
q.pop();
if (i == (size - 1))result.push_back(tmp->val);
if (tmp->left != nullptr)q.push(tmp->left);
if (tmp->right != nullptr)q.push(tmp->right);
}
}
return 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:
vector<double> averageOfLevels(TreeNode* root)
{
vector <double> result;
queue<TreeNode*> q;
if (root != nullptr)q.push(root);
while (!q.empty())
{
long sum = 0;
int size = q.size();
int n = size;
while (size--)
{
auto tmp = q.front();
q.pop();
sum += (tmp->val);
if (tmp->left != nullptr)q.push(tmp->left);
if (tmp->right != nullptr)q.push(tmp->right);
}
result.push_back(sum*1.0 / n);
}
return result;
}
};
/*
// 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>> result;
queue<Node*> q;
if (root != nullptr)q.push(root);
while (!q.empty())
{
int size = q.size();
vector<int> vec;
while (size--)
{
auto tmp = q.front();
q.pop();
vec.push_back(tmp->val);
for (auto i : tmp->children)
{
if (i != nullptr)
{
q.push(i);
}
}
}
result.push_back(vec);
}
return 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:
vector<int> largestValues(TreeNode* root)
{
vector<int> result;
queue<TreeNode*> q;
if (root != nullptr)q.push(root);
while (!q.empty())
{
int size = q.size();
int min_num = INT32_MIN;
while (size--)
{
auto tmp = q.front();
q.pop();
min_num = tmp->val > min_num ? tmp->val : min_num;
if (tmp->left != nullptr)q.push(tmp->left);
if (tmp->right != nullptr)q.push(tmp->right);
}
result.push_back(min_num);
}
return result;
}
};
/*
// 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 != nullptr)q.push(root);
Node* pre;
while (!q.empty())
{
int size = q.size();
//表示前一个节点
Node* headNodePerlevel;
//表示当前节点
Node* node;
for (int i = 0; i < size; i++)
{
//每一层的第一个节点
if (i == 0)
{
headNodePerlevel = q.front();
q.pop();
node = headNodePerlevel;
}
//当前层的别的节点
else
{
node = q.front();
q.pop();
headNodePerlevel->next = node;
headNodePerlevel = node;
}
if (node->left != nullptr)q.push(node->left);
if (node->right != nullptr)q.push(node->right);
}
//遍历完这一层,最后的节点指向Null
node->next = nullptr;
}
return root;
}
};
/*
// 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 != nullptr)q.push(root);
while (!q.empty())
{
int size = q.size();
Node* preNode;
Node* nownode;
for (int i = 0; i < size; i++)
{
if (i == 0)
{
preNode = q.front();
q.pop();
nownode = preNode;
}
else
{
nownode = q.front();
q.pop();
preNode->next = nownode;
preNode = nownode;
}
if (nownode->left != nullptr)q.push(nownode->left);
if (nownode->right != nullptr)q.push(nownode->right);
}
nownode->next = nullptr;
}
return root;
}
};
class Solution {
public:
int maxDepth(TreeNode* root)
{
if (root == nullptr)return 0;
queue<TreeNode*> q;
q.push(root);
int count = 0;
while (!q.empty())
{
int size = q.size();
while (size--)
{
auto tmp = q.front();
q.pop();
if (tmp->left!= nullptr)q.push(tmp->left);
if (tmp->right!= nullptr)q.push(tmp->right);
}
count++;
}
return count;
}
};
/**
* 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)
{
if (root == nullptr)return 0;
queue<TreeNode*> q;
q.push(root);
int count = 0;
while (!q.empty())
{
int size = q.size();
count++;
while (size--)
{
auto tmp = q.front();
q.pop();
if (tmp->left != nullptr)
{
q.push(tmp->left);
}
if (tmp->right != nullptr)
{
q.push(tmp->right);
}
if (!tmp->left && !tmp->right)
{
return count;
}
}
}
return count;
}
};