while (pre->right != NULL && pre->right != current) {
pre = pre->right;
}
if (pre->right == NULL) {
pre->right = current;
current = current->left;
} else {
pre->right = NULL;
result[(*returnSize)++] = current->val;
current = current->right;
}
}
}
return result;
}
// 测试函数
int main() {
// 构造二叉树 [1, null, 2, 3]
struct TreeNode node3 = {3, NULL, NULL};
struct TreeNode node2 = {2, &node3, NULL};
struct TreeNode root = {1, NULL, &node2};
int returnSize;
int *result = inorderTraversal(&root, &returnSize);
printf("中序遍历结果: ");
for (int i = 0; i < returnSize; i++) {
printf("%d ", result[i]);
}
printf("\n");
free(result); // 释放内存
return 0;
}
复制代码
复杂度分析
时间复杂度:
O ( n ) O(n) O(n),每个节点访问两次。
空间复杂度:
O ( 1 ) O(1) O(1),无需额外栈空间。
总结
方法时间复杂度空间复杂度特点递归 O ( n ) O(n) O(n) O ( h ) O(h) O(h)简单易实现,但依赖递归栈。迭代(栈) O ( n ) O(n) O(n) O ( h ) O(h) O(h)显式利用栈,得当较大的二叉树。Morris 遍历 O ( n ) O(n) O(n) O ( 1 ) O(1) O(1)无额外空间需求,但实现较复杂。 不同方法得当不同场景,推荐优先利用递归和迭代方法,Morris 遍历得当对空间要求极高的情况。