C语言: 后序遍历二叉树的非递归算法
时间: 2023-09-16 15:14:54 浏览: 95
后序遍历二叉树的非递归算法可以使用栈来实现,具体实现步骤如下:
1. 定义一个栈,将根节点压入栈中。
2. 定义一个指针p,指向根节点。
3. 定义一个变量lastvisit,用于记录上一次访问的节点。
4. 当栈不为空时,执行以下操作:
1. 将栈顶节点p弹出,如果p的左右子树都为空或者上一次访问的节点是p的左右子树中的一个,则访问p节点并将lastvisit设为p。
2. 如果p的左右子树不为空且上一次访问的节点不是p的左右子树中的一个,则分别将p的右子树和左子树压入栈中。
5. 当栈为空时,遍历结束。
下面是一个示例代码实现:
```c
void postOrderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
Stack stack = createStack();
TreeNode *p = root;
TreeNode *lastvisit = NULL;
while (!isEmpty(stack) || p != NULL) {
if (p != NULL) {
push(stack, p);
p = p->left;
} else {
TreeNode *top = getTop(stack);
if (top->right != NULL && lastvisit != top->right) {
p = top->right;
} else {
visit(top);
lastvisit = top;
pop(stack);
}
}
}
}
```
其中,TreeNode表示树的节点,Stack表示栈,createStack()表示创建一个栈,isEmpty(stack)表示判断栈是否为空,push(stack, p)表示将节点p压入栈中,getTop(stack)表示获取栈顶元素,visit(top)表示访问节点top,lastvisit记录上一次访问的节点,pop(stack)表示弹出栈顶元素。
阅读全文