递归遍历
class Solution {
public:
void preTraver(TreeNode* root, vector<int>& ans) {
if (root == nullptr) return;
ans.push_back(root->val);
preTraver(root->left, ans);
preTraver(root->right, ans);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
preTraver(root, ans);
return ans;
}
};
class Solution {
public:
void midTraver(TreeNode * root, vector<int> & ans) {
if (root == nullptr) return;
midTraver(root->left, ans);
ans.push_back(root->val);
midTraver(root->right, ans);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
midTraver(root, ans);
return ans;
}
};
class Solution {
public:
void postTraver(TreeNode* root, vector<int>& ans) {
if (root == nullptr) return;
postTraver(root->left, ans);
postTraver(root->right, ans);
ans.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
postTraver(root, ans);
return ans;
}
};
迭代遍历
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> ans;
if (root == nullptr) return ans;
st.push(root);
while(!st.empty()){
TreeNode* curNode = st.top();
st.pop();
ans.push_back(curNode->val);
//注意栈的特性,后入先出,通过模拟,非递归的次于应该是右子树先入栈,左子树再入栈
//才能达到中左右的效果
if (curNode->right) st.push(curNode->right);
if (curNode->left) st.push(curNode->left);
}
return ans;
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> st;
TreeNode* curNode = root;
if (root == nullptr) return ans;
while(curNode || !st.empty()) {
if (curNode != nullptr) {
st.push(curNode);
curNode = curNode->left;
}else {
curNode = st.top();
st.pop();
ans.push_back(curNode->val);
curNode = curNode->right;
}
}
return ans;
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> st;
TreeNode* curNode = root;
if (root == nullptr) return ans;
st.push(curNode);
while (!st.empty()) {
curNode = st.top();
st.pop();
ans.push_back(curNode->val);
if (curNode->left) st.push(curNode->left);
if (curNode->right) st.push(curNode->right);
}
reverse(ans.begin(), ans.end());
return ans;
return ans;
}