援引自:https://blog.csdn.net/jsh0123/article/details/50624930
非递归算法:
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
struct TreeNode** stack=NULL,*pre=root;
*returnSize=0;
int i=0,j=0,*nums=NULL;
stack = (struct TreeNode **)malloc(sizeof(struct TreeNode *));//必须初始化一下,否则realloc不好用
nums = (int *)malloc((j+1)*sizeof(int));
while(i||pre) //堆栈不为空或结点不为空
{
if(pre){
stack = (struct TreeNode **)realloc(stack, sizeof(struct TreeNode *)*i+1);
stack[i++]=pre;
pre=pre->left;
}//左节点依次入栈,直至最左下元素
else{
pre=stack[--i];//i先存结点再自加,出栈时先自减再出栈,当i=0时栈确实是空的
nums = (int *)realloc(nums, sizeof(int)*(j+1));
nums[j++]=pre->val;
*returnSize+=1;
pre=pre->right;
}//出栈目前左下叶子节点,有右结点则遍历右结点,否则继续出栈
}
return nums;
}
递归算法:
int *nums=NULL,i=0;
void inorder(struct TreeNode* root)
{
nums = (int *)realloc(nums, sizeof(int)*(i+1));
if(root){
inorder(root->left);
nums[i++]=root->val;
inorder(root->right);
}
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize=0;
i=0;
if(root==NULL)
return NULL;
else
{
nums = (int *)malloc(sizeof(int));
inorder(root);
*returnSize=i;
return nums;
}
}