二叉树的前序遍历就是先根遍历,顺序是根--左--右,如下图所示,1是根节点,先返回1,再看左结点,没有左结点,再看右结点,右边树的根节点是2,返回2,再看左结点,2的左结点是1,返回1,故返回的顺序是1 2 3
输入:root = [1,null,2,3]
输出:[1,2,3]
树的结点定义如下:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
递归的C语言代码如下:
void preor (struct TreeNode* root, int* res, int* size){
if (root == NULL) return; //当递归到根节点为空时,说明已经到了叶节点的子结点,直接返回
res[(*size)++] = root->val; //将根结点的值保存在res中
preor(root->left, res, size); //递归左子树
preor(root->right, res, size); //递归右子树
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
int* res = malloc(sizeof(int) * 2000); //res是结点返回的序列,这里先为res创建空间
*returnSize = 0;
preor(root, res, returnSize);
return res;
}
递归的C++代码如下:
class Solution {
public:
void preorder(TreeNode *root, vector<int> &res) {
if (root == nullptr) {
return;
} //当递归到根节点为空时,说明已经到了叶节点的子结点,直接返回
res.push_back(root->val); //将根结点的值保存在res中
preorder(root->left, res); //递归左子树
preorder(root->right, res); //递归右子树
}
vector<int> preorderTraversal(TreeNode *root) {
vector<int> res; //创建容器res存放结点的值
preorder(root, res);
return res;
}
};
用递归法来解决二叉树的中序遍历的空间复杂度是O(n),空间复杂度取决于递归的栈深度,当二叉树是一条链的时候栈的深度会达到O(n);时间复杂度也是O(n),这是很好理解的,因为每个结点都遍历了一遍且只遍历一遍。