在这几道二叉树遍历的题目中,应注意的是:对于有返回值的调用函数来说,存储返回值的vector变量不能在每次函数调用时都被重新初始化。所以我在这里定义了一个位于函数外的成员变量用来存储返回值。
66.题目描述:给出一棵二叉树,返回其节点值的前序遍历。
二叉树的前序遍历:根节点——>左子树——>右子树,使用递归实现,先处理中间结点,然后左子树,右子树。C++代码如下:
class Solution {
public:
/**
* @param root: A Tree
* @return: Preorder in ArrayList which contains node values.
*/
vector <int> preorder;//注意,定义的变量不能在每次调用时被重新定义。
vector<int> preorderTraversal(TreeNode * root) {
// write your code here
if(root==NULL){ //如果是空子树的话,直接返回。
return preorder;
}
preorder.push_back(root->val);
if(root->left!=NULL){
preorderTraversal(root->left);
}
if(root->right!=NULL){
preorderTraversal(root->right);
}
return preorder;
}
};
67.题目描述:给出一棵二叉树,返回其中序遍历
二叉树的中序遍历:左子树——>根节点——>右子树。使用递归实现,先处理左子树,然后是根节点,最后右子树。用C++实现:
class Solution {
public:
/**
* @param root: A Tree
* @return: Inorder in ArrayList which contains node values.
*/
vector<int> inorder;
vector<int> inorderTraversal(TreeNode * root) {
// write your code here
if(root==NULL){
return inorder;
}
inorderTraversal(root->left);
inorder.push_back(root->val);
inorderTraversal(root->right);
return inorder;
}
};
68. 题目描述:给出一棵二叉树,返回其节点值的后序遍历。
二叉树后序遍历:左子树——>右子树——>根节点。使用递归算法,先处理左子树,然后右子树,最后根节点。用C++实现:
class Solution {
public:
/**
* @param root: A Tree
* @return: Postorder in ArrayList which contains node values.
*/
vector<int> postorder;
vector<int> postorderTraversal(TreeNode * root) {
// write your code here
if(root==NULL){
return postorder;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
postorder.push_back(root->val);
return postorder;
}
};
分割线—————————————————————————————————————————————————
递归是一个比较难理解的思想。
①递归的定义是:“一个算法,这个算法调用自己来完成它的部分工作”。递归算法要想成功,必须在比原始问题规模更小的问题上调用自己。
②递归由两个部分组成:初始情况(base case)+递归部分。其中初始情况只处理可以直接解决而不需要再次递归调用的简单输入。对于二叉树的遍历,它的初始情况就是对根节点的访问,而递归部分是对左右子树的访问。