开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]
示例 2:
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[2,6,14,11,7,3,12,8,4,13,9,10,5,1]
提示:
- 节点总数在范围 [0, 10^4] 内
- 0 <= Node.val <= 10^4
- n 叉树的高度小于或等于 1000
进阶:递归法很简单,你可以使用迭代法完成此题吗?
二、思路分析:
原来只知道傻傻的简单递归。
这里利用了前序遍历的方法,前序遍历是弹出根节点的后马上存入孩子节点,但孩子节点是逆序的,从而保证左孩子始终在栈顶,以满足根-左-右的特点。
所以后序遍历的时候,要将前序遍历中存入孩子节点的顺序按正常来存,这样右孩子就出现在栈顶,最终就是根-右-左的顺序。
这与后序遍历的特点左-右-根正好相反,所以最后翻转一下即可。
三、AC 代码:
/**
* Definition for a Node.
* struct Node {
* int val;
* int numChildren;
* struct Node** children;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define MAXSIZE 10000
typedef struct{
struct Node* data[MAXSIZE];
int top;
}SqStack;
SqStack* CreateStack();
bool StackEmpty(SqStack* S);
bool StackFull(SqStack* S);
void Push(SqStack* S, struct Node* node);
void Pop(SqStack* S);
void PrintStack(SqStack* S);
int* postorder(struct Node* root, int* returnSize) {
int* nums;
nums = (int *)malloc(sizeof(int) * MAXSIZE);
if(!root){
*returnSize = 0;
return nums;
}
SqStack* S = CreateStack();
int i=0, j;
Push(S, root);
while( ! StackEmpty(S) ){
//PrintStack(S);
struct Node* temp = malloc(sizeof(struct Node));
temp = S->data[S->top];
nums[i++] = temp->val;
Pop(S);
for(j=0; j<temp->numChildren; j++)
Push(S, temp->children[j]);
}
*returnSize = i;
for(i=0; i<(*returnSize)/2; i++){
j = nums[i];
nums[i] = nums[*returnSize-1-i];
nums[*returnSize-1-i] = j;
}
return nums;
}
SqStack* CreateStack(){
SqStack* S;
S = (SqStack *)malloc(sizeof(SqStack));
S->top = -1;
return S;
}
bool StackEmpty(SqStack* S){
return S->top == -1;
}
bool StackFull(SqStack* S){
return S->top+1 == MAXSIZE;
}
void Push(SqStack* S, struct Node* node){
if( ! StackFull(S) ){
S->top++;
S->data[S->top] = node;
}
}
void Pop(SqStack* S){
if( ! StackEmpty(S) )
S->top--;
}
void PrintStack(SqStack* S){
int i;
for(i=0; i<=S->top; i++)
printf("%d ", S->data[i]->val);
printf("\n");
}