二叉树的前序遍历
前序的遍历的特点,根节点->左子树->右子树。
class Solution {
public:
void search(TreeNode* root, vector<int>& res){
if(root == NULL)
return;
res.push_back(root->val);
search(root->left, res);
search(root->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
search(root, res);
return res;
}
};
二叉树的中序遍历
中序遍历:左子树->根节点->右子树(左->根->右)。
// 递归法
class Solution {
public:
void search(TreeNode* root, vector<int>& res){
if(root == NULL)
return;
search(root->left, res);
res.push_back(root->val);
search(root->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
search(root, res);
return res;
}
};
// 堆栈法
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode *> stk;
vector<int> res;
while(root != nullptr || !stk.empty()){
// 定位到最左侧节点
while(root != nullptr){
stk.push(root);
root = root->left;
}
// 取出最左侧节点(若当前节点为空,则下述语句会使遍历器上移一层)
root = stk.top();
stk.pop();
// 打印节点数值
res.push_back(root->val);
root = root->right;
}
return res;
}
};
二叉树的后序遍历
后序遍历:左子树->右子树->根节点(左->右->根)。
class Solution {
public:
void search(TreeNode* root, vector<int>& res){
if(root == NULL)
return;
search(root->left, res);
search(root->right, res);
res.push_back(root->val);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
search(root, res);
return res;
}
};
总结
在二叉树的递归遍历中,通过调节打印语句和递归语句的位置来实现不同的遍历顺序。