用栈实现层序非递归遍历算法
时间: 2023-12-07 17:38:37 浏览: 17
层序遍历是一种广度优先遍历,可以使用队列来实现非递归算法。但是,如果要使用栈来实现层序遍历,需要对栈的操作进行一些变化。
具体实现方法如下:
1.首先将根节点入栈。
2.进入循环,当栈不为空时,执行以下操作:
3.弹出栈顶元素,并将其值存储到结果列表中。
4.将弹出的节点的右子节点(如果存在)入栈。
5.将弹出的节点的左子节点(如果存在)入栈。
6.重复步骤3-5,直到栈为空。
下面是Python代码实现:
```python
def levelOrder(root):
if not root:
return []
stack = [root]
res = []
while stack:
node = stack.pop(0)
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
```
相关问题
先序非递归遍历算法遍历二叉树 中序非递归遍历算法遍历二叉树 后序非递归遍历算法遍历二叉树 层序遍历二叉树
好的,我可以给您介绍一下二叉树的四种非递归遍历算法以及层序遍历。
先序非递归遍历算法:
1. 新建一个栈,将根节点入栈。
2. 当栈不为空时,取出栈顶元素并访问它。
3. 将当前节点的右子节点(如果存在)入栈,再将左子节点(如果存在)入栈。
4. 重复步骤2-3,直到栈为空。
中序非递归遍历算法:
1. 新建一个栈,将根节点入栈。
2. 如果当前节点不为空,则将当前节点的左子节点全部入栈,并将当前节点置为左子节点。
3. 如果当前节点为空,则取出栈顶元素并访问它,将当前节点置为它的右子节点。
4. 重复步骤2-3,直到栈为空。
后序非递归遍历算法:
1. 新建两个栈:s1和s2,将根节点入s1。
2. 当s1不为空时,取出栈顶元素并将其压入s2中。
3. 将当前节点的左子节点(如果存在)入s1,再将右子节点(如果存在)入s1。
4. 重复步骤2-3,直到s1为空。
5. 依次访问s2中的元素即可得到后序遍历结果。
层序遍历算法:
1. 新建一个队列,将根节点入队。
2. 当队列不为空时,取出队首元素并访问它。
3. 将当前节点的左子节点(如果存在)入队,再将右子节点(如果存在)入队。
4. 重复步骤2-3,直到队列为空。
C语言非递归的方法实现对给定二叉树的先序和层序遍历算法。
先序遍历:使用栈来实现非递归的先序遍历,从根节点开始,先将根节点入栈,然后进入循环,每次从栈中弹出一个节点,打印该节点的值,并将其右子节点和左子节点依次入栈(注意先入右子节点再入左子节点),直到栈为空。
层序遍历:使用队列来实现非递归的层序遍历,从根节点开始,先将根节点入队列,然后进入循环,每次从队列中弹出一个节点,打印该节点的值,并将其左子节点和右子节点依次入队列,直到队列为空。
代码实现如下:
先序遍历:
```c
void PreOrderTraversal(BiTree T)
{
if(T == NULL)
return;
Stack S;
InitStack(&S);
Push(&S, T);
while(!StackEmpty(&S))
{
BiTree p;
Pop(&S, &p);
printf("%c ", p->data);
if(p->rchild)
Push(&S, p->rchild);
if(p->lchild)
Push(&S, p->lchild);
}
}
```
层序遍历:
```c
void LevelOrderTraversal(BiTree T)
{
if(T == NULL)
return;
Queue Q;
InitQueue(&Q);
EnQueue(&Q, T);
while(!QueueEmpty(&Q))
{
BiTree p;
DeQueue(&Q, &p);
printf("%c ", p->data);
if(p->lchild)
EnQueue(&Q, p->lchild);
if(p->rchild)
EnQueue(&Q, p->rchild);
}
}
```