先复习一下二叉树数据结构的写法
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}
144. 二叉树的前序遍历
采用递归的方式进行实现 。
对于递归主要关键在于三点:
(1)确定递归函数的参数和返回值。在递归函数中需要进行记录或者修改的部分要进行传递作为参数,并且明确每次递归返回什么,从而设置递归函数的返回值类型。
(2)确定递归函数的终止条件。经常出现栈溢出的情况就是递归的终止条件没有设置好。
(3)确定递归内部的处理逻辑。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
本题中,因为需要返回遍历节点的值,递归的参数传递结果数组,无需返回值;当遍历到空节点时就进行返回;因为是前序遍历,所以采用中左右的内部处理逻辑。
代码实现:
class Solution {
public:
void traversal(TreeNode *cur, vector<int> &result){
if (cur == NULL)
return;
result.push_back(cur->val);
traversal(cur->left, result);
traversal(cur->right, result);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int>result;
traversal(root, result);
return result;
}
};
145. 二叉树的后序遍历
和前序遍历类似,内部处理逻辑稍作修改即可。
class Solution {
public:
void Traversal(TreeNode *cur, vector<int> &result){
if (cur == NULL)
return;
Traversal(cur->left, result);
Traversal(cur->right, result);
result.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
Traversal(root, result);
return result;
}
};
94. 二叉树的中序遍历
class Solution {
public:
void traversal(TreeNode *cur, vector<int> &result){
if (cur == NULL)
return;
traversal(cur->left, result);
result.push_back(cur->val);
traversal(cur->right, result);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int>result;
traversal(root, result);
return result;
}
};