递归解法:
- 确定递归函数入参及返回值
- 确定终止条件
- 确定单层递归的逻辑
// 前、中、后序递归遍历只是 vistTraversal 函数中“访问节点”语句的位置不同
void vistTraversal(TreeNode* root, vector<int> &vec) {
if (root == nullptr) return;
vec.push_back(root->val); // 访问节点
vistTraversal(root->left, vec);
vistTraversal(root->right, vec);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> vec_ret;
vistTraversal(root, vec_ret);
return vec_ret;
}
迭代解法:
- 先序借助栈
- 先序(中左右),后序(左右中),先序调整为中右左,然后逆转得到后序
- 中序,借助栈与指针
// 先序
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> stack_helper;
vector<int> ret;
if (root == nullptr) return ret;
stack_helper.push(root);
while(!stack_helper.empty()) {
auto tmp_ptr = stack_helper.top();
ret.push_back(tmp_ptr->val);
stack_helper.pop();
if (tmp_ptr->right) stack_helper.push(tmp_ptr->right); // 先进则后弹出
if (tmp_ptr->left) stack_helper.push(tmp_ptr->left);
}
return ret;
}
// 后序
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> stack_helper;
vector<int> ret;
if (root == nullptr) return ret;
stack_helper.push(root);
while(!stack_helper.empty()) {
auto tmp_ptr = stack_helper.top();
ret.push_back(tmp_ptr->val);
stack_helper.pop();
if (tmp_ptr->left) stack_helper.push(tmp_ptr->left);
if (tmp_ptr->right) stack_helper.push(tmp_ptr->right);
}
return vector<int>{ret.rbegin(), ret.rend()};
}
// 中序
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> stack_helper;
vector<int> vec_ret;
TreeNode* cur = root;
while(cur != NULL || !stack_helper.empty()) {
if (cur != NULL) {
stack_helper.push(cur);
cur = cur->left;
} else {
cur = stack_helper.top();
vec_ret.push_back(cur->val);
stack_helper.pop();
cur = cur->right;
}
}
return vec_ret;
}
统一迭代解法
解题思路:插入空指针代表该节点访问但未被处理过
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> stack_helper;
vector<int> vec_ret;
if (root != nullptr) stack_helper.push(root);
while(!stack_helper.empty()) {
TreeNode* node = stack_helper.top();
if (node != nullptr) {
stack_helper.pop();
if (node->right) stack_helper.push(node->right); // 右
stack_helper.push(node); // 中
stack_helper.push(nullptr);
if (node->left) stack_helper.push(node->left); // 左
} else {
stack_helper.pop();
node = stack_helper.top();
stack_helper.pop();
vec_ret.push_back(node->val);
}
}
return vec_ret;
}