1.算法思想
- 用一维数组来模拟堆栈先进后出
- 首先入栈根节点,数组长度+1
- 出栈栈顶元素(数组末尾元素),数组长度-1
- 判断该元素是否有子节点,如果有子节点存入栈,数组长度增加n(节点个数)
- 循环直到栈中没有元素,数组长度为0
2.演示代码
typedef struct node
{
int i;
struct node *child;
}Node;
// root树的根节点
void travel(node *root)
{
// 堆栈计数器
unsigned shot stack_count = 0;
/**
* stack用于遍历多叉树时的堆栈
* 初始化时,用二级指针p指向stack数组首地址
*/
Node *stack[SPAN];
Node **p = stack;
memset(stack,0,SPAN);
Node *node = nullptr, child_node = nullptr;
// 根节点压栈
*(p + stack_count++) = root;
// 遍历多叉树
while (stack_count)
{
// 出栈,数组的尾部作为栈顶元素,首先出栈
node = *(p + --stack_count);
// 获取子节点的链表头第一个节点
child_node = node->child->front();
// 表示当前节点还有子节点
while (nullptr != child_node)
{
// 子节点节点压栈,用于遍历
*(p + stack_count++) = child_node;
child_node = child_node->child;
}
}
}