深度优先遍历 包括三种: 前中后 序 三种 遍历;
这三种遍历都可以通过 递归的方法解决;
递归的条件:
-
确定递归函数输出类型, 递归函数的输入参数;
-
递归函数中的 终止条件;
-
每一递归中, 所需要执行的操作;
此时大家可以做一做leetcode上三道题目,分别是:
144.二叉树的前序遍历
94.二叉树的中序遍历
145.二叉树的后序遍历
1. 前序遍历的递归方式
递归函数的编写;
先序遍历函数:
- 新建vector 容器,用于存放遍历的结果;
- 调用递归函数;
- 返回 遍历结果;
#include "vector"
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
// 默认构造函数, 列表形式赋值;
TreeNode(int x): val(x), left(nullptr), right(nullptr){
}
};
class Solution1{
public:
// 递归三要素
void traversal(TreeNode* cur, vector<int>& res){
// 1. 递归函数的 返回值类型, 输入参数 的确定;
// 2. 递归的终止条件;
if( cur == nullptr) return;
// 3. 确定每一次 递归中,所需要执行的操作;
res.push_back(cur->val);
traversal(cur->left, res);
traversal(cur->right, res);
}
vector<int> preOrder(TreeNode* root){
vector<int> result;
traversal(root, result);
return result;
}
};
2. 中序遍历的递归方式;
class Solution2{
// 中序遍历
public:
void traversal(TreeNode* cur, vector<int>& res){
//1. 递归函数的输出类型, 输入参数;
// 2. 递归的终止条件;
if(cur == nullptr) return;
// 3. 单层递归中,需要执行的操作;
traversal(cur->left, res);
res.push_back(cur->val);
traversal(cur->right, res);
}
vector<int> inOrder(TreeNode* root){
vector<int> result;
traversal(root, result);
return result;
}
};
3.后序遍历的 递归方式
class Solution3{
public:
void traversal(TreeNode* cur, vector<int>& res ){
// 1. 确定递归函数的 输出类型, 递归函数的输入参数;
// 2. 递归的终止条件;
if(cur == nullptr) return;
// 3. 单层递归中, 执行的操作
traversal(cur->left, res);
traversal(cur->right, res);
res.push_back(cur->val);
}
vector<int> postOrder(TreeNode* root){
vector<int> result;
traversal(root, result);
return result;
}
};