题目链接
二叉树的创建
class TreeNode{
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
二叉树的遍历
递归遍历
前序遍历
void f(TreeNode* root, vector<int>& v) {
if (root == NULL)return;
v.push_back(root->val);
f(root->left, v);
f(root->right, v);
}
中序遍历
void f(TreeNode* root, vector<int>& v) {
if (root == NULL)return;
f(root->left, v);
v.push_back(root->val);
f(root->right, v);
}
后序遍历
void f(TreeNode* root, vector<int>& v) {
if (root == NULL)return;
f(root->left, v);
f(root->right, v);
v.push_back(root->val);
}
迭代遍历
运用 stack 进行遍历
前序遍历
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*>st;
vector<int>v;
if (root != NULL)st.push(root);//使栈中数据不为 NULL
while (!st.empty())
{
TreeNode* temp = st.top();
st.pop();
v.push_back(temp->val);
//前序遍历为中左右,在入栈时先压入右节点,后压入左节点,
//出栈时才会先出左节点,后出右节点
if (temp->right)st.push(temp->right); //使栈中数据不为 NULL
if (temp->left)st.push(temp->left); //使栈中数据不为 NULL
}
return v;
}
};
后序遍历
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*>st;
vector<int>v;
if (root != NULL)st.push(root);//使栈中数据不为 NULL
while (!st.empty())
{
TreeNode* temp = st.top();
st.pop();
//当前遍历方式为中右左,遍历结束后反转 v 即可为左右中
v.push_back(temp->val);
if (temp->left)st.push(temp->left);
if (temp->right)st.push(temp->right);
}
//后序遍历遍历顺序为左右中,把中右左反转即为左右中
reverse(v.begin(), v.end());
return v;
}
};
中序遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*>st;
vector<int>v;
TreeNode* temp = root;
while (temp != NULL || !st.empty())
{
if (temp != NULL) {
st.push(temp);
temp = temp->left;
}
else {
temp = st.top();
st.pop();
v.push_back(temp->val);
temp = temp->right;
}
}
return v;
}
};
层序遍历
题目链接102. 二叉树的层序遍历 - 力扣(LeetCode)
层序遍历是从上到下, 从左到右一层一层地遍历, 所以没有前中后序遍历的写法
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*>st;
vector<vector<int>>result;
if (root != NULL)st.push(root);
while (!st.empty())
{
vector<int>v;
int size = st.size();
//用固定大小 size ,queue.size() 会变化
for (int i = 0; i < size; i++) {
TreeNode* temp = st.front();
st.pop();
v.push_back(temp->val);
if (temp->left)st.push(temp->left);
if (temp->right)st.push(temp->right);
}
result.push_back(v);
}
return result;
}
};
初学者,见解不足,如有错误请指出