对于二叉树的前后中序遍历,递归遍历的三要素如下:
-
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
-
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
-
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
以前序为例:
1、确定递归函数的参数和返回值:
void traversal(TreeNode* cur, vector<int>& vec)
vec用来存放结点数值。
2、确定终止条件
if (cur == NULL) return;
当结点为空时,终止遍历。
3、确定单层递归的逻辑
vec.push_back(cur->val); // 中
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
完整的C++代码如下:
前序遍历:
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec){
if(cur == NULL){
return;
}
vec.push_back(cur->val);
traversal(cur->left, vec);
traversal(cur->right, vec);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
中序遍历
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec){
if(cur == NULL){
return;
}
traversal(cur->left, vec);
vec.push_back(cur->val);
traversal(cur->right, vec);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
后序遍历
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec){
if(cur == NULL){
return;
}
traversal(cur->left, vec);
traversal(cur->right, vec);
vec.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
这里前提二叉树的节点都是封装定义好的,如果没有官方定义,需要自己定义二叉树结点等信息,需要熟练掌握。
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode (int x) : val(x), left(NULL), right(NULL){}
};