leetcode----94.二叉树的中序遍历
一、题目描述
二、解题思路
中序遍历:首先遍历左子树,再访问根节点,最后遍历右子树。因此可以运用递归的思路进行遍历,本题目也要返回遍历后的节点顺序,因此需要定义一个数组对访问到的节点进行存储,以方便输出,我们在这里定义一个res来进行存储,题目所给的returnSize可以作为数组的长度进行累加,进行递归调用函数即可实现。
第二种方法是采用栈的方法进行迭代以遍历二叉树,首先了解栈的特点:先进后出。因此,首先将根节点入栈,随后遍历左子树入栈,直至查找到空节点为止,随后将节点出栈,再遍历右子树直至空节点为止,再出栈后即可完成遍历。
三、代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
//递归实现
void dfs(struct TreeNode*root,int* res,int* resSize){
if(root == NULL){
return;
}
dfs(root->left,res,resSize);
res[(*resSize)++] = root->val;
dfs(root->right,res,resSize);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
int* res = malloc(sizeof(int)*501);
*returnSize = 0;
dfs(root,res,returnSize);
return res;
}
//迭代实现
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize = 0;
int* res = malloc(sizeof(int) * 501);
struct TreeNode** stk = malloc(sizeof(struct TreeNode*) * 501);
int top = 0;
while (root != NULL || top > 0) {
while (root != NULL) {
stk[top++] = root;
root = root->left;
}
root = stk[--top];
res[(*returnSize)++] = root->val;
root = root->right;
}
return res;
}
四、复杂度分析
时间复杂度:O(n),其中 n 为二叉树节点的个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。
空间复杂度:O(n)。空间复杂度取决于递归的栈深度,而栈深度在二叉树为一条链的情况下会达到 O(n) 的级别。