leetcode 94.二叉树的中序遍历(binary tree inorder traversal)C语言
1.description
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2.solution
2.1 递归
int get_size(struct TreeNode *root){
if(root == NULL) return 0;
return get_size(root->left) + get_size(root->right) + 1;
}
void inorder(int *returnSize, int *res, struct TreeNode *root){
if(root == NULL) return;
inorder(returnSize, res, root->left);
res[(*returnSize)++] = root->val;
inorder(returnSize, res, root->right);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize = 0;
int node_size = get_size(root);
int *res = (int*)malloc(sizeof(int)*node_size);
inorder(returnSize, res, root);
return res;
}
2.2 迭代
#define MAX_LEN 10000
int get_size(struct TreeNode *root){
if(root == NULL) return 0;
return get_size(root->left) + get_size(root->right) + 1;
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize = 0;
if(root==NULL) return NULL;
int node_size = get_size(root);
int *res = (int*)malloc(sizeof(int)*node_size);
struct TreeNode *stack[MAX_LEN];
struct TreeNode *p = NULL;
int top = -1;
stack[++top] = root;
while(top!=-1){
while(stack[top]!=NULL){
stack[top+1] = stack[top]->left;
top++;
}
top--; // 空指针出栈
if(top!=-1){
p = stack[top];
res[(*returnSize)++] = p->val;
stack[top] = p->right;
}
}
return res;
}