【leetcode】二叉树刷题记录(一)遍历问题
前言
本文是基于leetcode二叉树例题的学习记录
144. 二叉树的前序遍历
链接
递归版本:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(!root)return ans;
traversal(root);
return ans;
}
void traversal(TreeNode* root)
{
if(!root)return ;
ans.push_back(root->val);
traversal(root->left);
traversal(root->right);
}
vector<int> ans;
};
迭代版本:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(!root)return ans;
traversal(root);
return ans;
}
void traversal(TreeNode* root)
{
q.push(root);
while(!q.empty())
{
TreeNode* cur = q.top();
q.pop();
ans.push_back(cur->val);
// 用栈保存要反着来
if(cur->right)q.push(cur->right);
if(cur->left)q.push(cur->left);
}
}
vector<int> ans;
stack<TreeNode*> q;
};
统一迭代版本(不同遍历改动小):
新学的,链接在这:链接
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root != NULL) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
if (node != NULL) {
st.pop();
if (node->right) st.push(node->right); // 右
if (node->left) st.push(node->left); // 左
st.push(node); // 中
st.push(NULL);
} else {
st.pop();
node = st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
};
144. 二叉树的中序遍历
链接
递归版本:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if(!root)return ans;
traversal(root);
return ans;
}
void traversal(TreeNode* root)
{
if(!root)return ;
traversal(root->left);
ans.push_back(root->val);
traversal(root->right);
}
vector<int> ans;
};
迭代版本:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if(!root)return ans;
traversal(root);
return ans;
}
void traversal(TreeNode* root)
{
TreeNode* cur = root;
while(cur || !q.empty())
{
if (cur)
{
q.push(cur);
cur = cur->left;
}
else
{
cur = q.top();
q.pop();
ans.push_back(cur->val);
cur = cur->right;
}
}
}
vector<int> ans;
stack<TreeNode*> q;
};
统一迭代版本(不同遍历改动小):
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root != NULL) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
if (node != NULL) {
st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中
if (node->right) st.push(node->right); // 添加右节点(空节点不入栈)
st.push(node); // 添加中节点
st.push(NULL); // 中节点访问过,但是还没有处理,加入空节点做为标记。
if (node->left) st.push(node->left); // 添加左节点(空节点不入栈)
} else { // 只有遇到空节点的时候,才将下一个节点放进结果集
st.pop(); // 将空节点弹出
node = st.top(); // 重新取出栈中元素
st.pop();
result.push_back(node->val); // 加入到结果集
}
}
return result;
}
};
144. 二叉树的后序遍历
链接
递归版本:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if(!root)return ans;
traversal(root);
return ans;
}
void traversal(TreeNode* root)
{
if(!root)return ;
traversal(root->left);
traversal(root->right);
ans.push_back(root->val);
}
vector<int> ans;
};
迭代版本:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if(!root)return ans;
traversal(root);
return ans;
}
void traversal(TreeNode* root)
{
q.push(root);
while(!q.empty())
{
TreeNode* cur = q.top();
q.pop();
ans.push_back(cur->val);
// 用栈保存要反着来
if(cur->left)q.push(cur->left);
if(cur->right)q.push(cur->right);
}
reverse(ans.begin(), ans.end());
}
vector<int> ans;
stack<TreeNode*> q;
};
这里一开始也没想到,原来把中右左反转以下就是左右中,很巧~
统一迭代版本(不同遍历改动小):
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root != NULL) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
if (node != NULL) {
st.pop();
st.push(node); // 中
st.push(NULL);
if (node->right) st.push(node->right); // 右
if (node->left) st.push(node->left); // 左
} else {
st.pop();
node = st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
};
144. 二叉树的层序遍历
链接
前中后用栈(先进后出),层序就用队列啦~(先进先出)
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
if (root != NULL) q.push(root);
vector<vector<int>> result;
while (!q.empty())
{
int size = q.size();
vector<int> vec;
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
vec.push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
result.push_back(vec);
}
return result;
}
};
递归方式:
没用过,学习一下~
链接
class Solution {
public:
void order(TreeNode* cur, vector<vector<int>>& result, int depth)
{
if (cur == nullptr) return;
if (result.size() == depth) result.push_back(vector<int>());
result[depth].push_back(cur->val);
order(cur->left, result, depth + 1);
order(cur->right, result, depth + 1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
int depth = 0;
order(root, result, depth);
return result;
}
};
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
queue<TreeNode*> q;
if (root != NULL) q.push(root);
vector<vector<int>> result;
while (!q.empty())
{
int size = q.size();
vector<int> vec;
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
vec.push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
result.push_back(vec);
}
reverse(result.begin(), result.end());
return result;
}
};
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<int> result;
while (!que.empty())
{
int size = que.size();
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);
if (i == size - 1) result.push_back(node->val);
}
}
return result;
}
};
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
queue<TreeNode*> q;
if (root != NULL) q.push(root);
vector<double> result;
while (!q.empty())
{
int size = q.size();
double res = 0;
for (int i = 0; i < size; i++)
{
TreeNode* node = q.front();
q.pop();
res += node->val;
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
res /= size;
result.push_back(res);
}
return result;
}
};
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
if (!root) {
return {};
}
vector<vector<int>> ans;
queue<Node*> q;
q.push(root);
while (!q.empty())
{
int cnt = q.size();
vector<int> level;
for (int i = 0; i < cnt; ++i)
{
Node* cur = q.front();
q.pop();
level.push_back(cur->val);
for (Node* child: cur->children)
q.push(child);
}
ans.push_back(move(level));
}
return ans;
}
};
class Solution {
public:
vector<int> largestValues(TreeNode* root) {
queue<TreeNode*> q;
if (root != NULL) q.push(root);
vector<int> result;
while (!q.empty())
{
int size = q.size();
int res = INT_MIN;
for (int i = 0; i < size; i++)
{
TreeNode* node = q.front();
q.pop();
res = max(res, node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
result.push_back(res);
}
return result;
}
};
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> que;
if (root != NULL) que.push(root);
while (!que.empty()) {
int size = que.size();
// vector<int> vec;
Node* nodePre;
Node* node;
for (int i = 0; i < size; i++) {
if (i == 0) {
nodePre = que.front(); // 取出一层的头结点
que.pop();
node = nodePre;
} else {
node = que.front();
que.pop();
nodePre->next = node; // 本层前一个节点next指向本节点
nodePre = nodePre->next;
}
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
nodePre->next = NULL; // 本层最后一个节点指向NULL
}
return root;
}
};
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> que;
if (root != NULL) que.push(root);
while (!que.empty()) {
int size = que.size();
vector<int> vec;
Node* nodePre;
Node* node;
for (int i = 0; i < size; i++) {
if (i == 0) {
nodePre = que.front(); // 取出一层的头结点
que.pop();
node = nodePre;
} else {
node = que.front();
que.pop();
nodePre->next = node; // 本层前一个节点next指向本节点
nodePre = nodePre->next;
}
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
nodePre->next = NULL; // 本层最后一个节点指向NULL
}
return root;
}
};
class Solution {
public:
int maxDepth(TreeNode* root) {
if (root == NULL) return 0;
int depth = 0;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()) {
int size = que.size();
depth++;
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);
}
}
return depth;
}
};
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == NULL) return 0;
int depth = 0;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()) {
int size = que.size();
depth++;
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);
if (!node->left && !node->right) {
return depth;
}
}
}
return depth;
}
};