/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @author Senky
* @date 2023.05.06
* @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
* @brief
* 这题数据规模就变成了1000了,递归调用肯定不可取的(时间限制1s),只能用栈来操作了
* 已经用线性栈,并且案例通过了,但是想用更常见一点的链栈来操作,核心代码就是左子树入栈
* @param root TreeNode类
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*/
/*栈的每一个元素是一个指向叶子结点的指针*/
struct StackNode
{
struct TreeNode* tree_node;
struct StackNode* next;
};
/*栈顶指针*/
struct Stack
{
struct StackNode* bottom;
struct StackNode* top;
int length;
};
/*判断栈是否为空*/
bool StackIsEmpty(struct Stack* stack)
{
return (stack->top == NULL);
}
//创建空栈
struct Stack* StackCreat()
{
struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
stack->bottom = NULL;
stack->top = NULL;
stack->length = 0;
return stack;
}
/*入栈*/
void StackPUSH(struct Stack* stack,struct TreeNode* tree_Node)
{
struct StackNode* stack_newnode = (struct StackNode*)malloc(sizeof(struct StackNode));
stack_newnode->tree_node = tree_Node;
stack_newnode->next = NULL;
if(StackIsEmpty(stack))
{
stack->top = stack->bottom = stack_newnode;
}
else
{
stack->top->next = stack_newnode;
stack->top = stack_newnode;
}
stack->length++;
}
/*出栈*/
struct TreeNode* StackPOP(struct Stack* stack)
{
if(StackIsEmpty(stack))
{
return NULL;
}
struct StackNode* temp = stack->top;
struct TreeNode* tree_node = stack->top->tree_node;
if(stack->length == 1)
{
stack->top = stack->bottom = NULL;
}
else
{
struct StackNode* target = stack->bottom;
while(target->next != stack->top) target = target->next;
target->next = NULL;
stack->top = target;
}
stack->length--;
free(temp);
return tree_node;
}
int* inorderTraversal(struct TreeNode* root, int* returnSize )
{
// write code here
struct Stack* stack = StackCreat();
int* result = (int*)calloc(1000,sizeof(int));
*returnSize = 0;
//左子树入栈
while(!StackIsEmpty(stack) || root != NULL)
{
/*根结点不为空则*/
while(root != NULL)
{
StackPUSH(stack,root);
root = root->left;
}
/*将最后一个没有左孩子的结点出栈*/
if(!StackIsEmpty(stack))
{
root = StackPOP(stack);
result[(*returnSize)++] = root->val;
/*将root指向右子树,再对右子树进行栈操作*/
root = root->right;
}
}
return result;
}