代码随想录算法训练营第十一天
二叉树
遍历方法:前中后序遍历、层序遍历
//定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
二叉树的递归遍历
递归遍历讲解
1.确定递归函数的参数和返回值;
2.确定终止条件;
3.确定单层递归逻辑。
144.二叉树的前序遍历
前中后只需改变递归函数中单层递归的逻辑。
class Solution {
public:
void traverse(TreeNode* root, vector<int>& result) {
if(root == nullptr) {
return;
}
result.push_back(root->val);
traverse(root->left, result);
traverse(root->right, result);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traverse(root,result);
return result;
}
};
145.二叉树的后序遍历
traverse(root->left, result);
traverse(root->right, result);
result.push_back(root->val);
94.二叉树的中序遍历
心得
traverse(root->left, result);
result.push_back(root->val);
traverse(root->right, result);
二叉树的迭代遍历
用栈来存储。
前序
加入根节点,然后弹出,再分别加入右节点和左节点,这样弹出时先弹出的是左节点。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == nullptr) return {};
stack<TreeNode*> st;
vector<int> result;
st.push(root);
while(!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
return result;
}
};
中序
用一个指针来遍历。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root == nullptr) return result;
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;
}
};
后序
后序与前序类似,将遍历顺序先改为中右左,再将得到的结果反转一下就可以得到左右中的顺序了。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == nullptr) return {};
stack<TreeNode*> st;
vector<int> result;
st.push(root);
while(!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if(node->left) st.push(node->left);
if(node->right) st.push(node->right);
}
return reverse(result.begin(), result.end());
}
};
二叉树层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if(root == nullptr) return result;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()) {
int size = que.size();
vector<int> vec;
for(int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
result.push_back(vec);
}
return result;
}
};