二叉树遍历前序中序后序哪些会用到栈
时间: 2024-08-12 08:06:02 浏览: 146
前序、中序和后序遍历二叉树的过程中都会用到栈这个数据结构。以下是它们各自的使用情况:
1. **前序遍历**(根-左-右):
- 首先将根节点压入栈中。
- 然后从栈顶弹出当前节点,并访问它(通常打印或存储)。
- 接着将该节点的右子节点(如果存在)压入栈中。
- 最后处理左子节点(如果存在),将其压入栈。
2. **中序遍历**(左-根-右):
- 从根节点开始,如果还有左子树,就进入并递归地对左子树进行中序遍历,这时需要借助栈来保存路径。
- 当左子树结束后,访问当前节点。
- 然后访问右子树,同理也需要栈来控制访问顺序。
3. **后序遍历**(左-右-根):
- 同样,从根节点开始,如果左子树和右子树都有,会递归地对它们进行后序遍历。
- 在遍历完左右子树后,才回溯到上一层并访问当前节点,这就需要用到栈来记录节点的访问顺序。
总的来说,无论是哪种遍历方式,栈都是用于存储待访问的节点,以便于按正确的顺序返回到父节点。
相关问题
如何用C语言正确地实现二叉树的构建以及前序、中序和后序遍历?并提供层次遍历的C语言代码示例。
在C语言中,我们可以使用结构体来表示二叉树节点,包括节点值和左右子节点指针。下面是创建二叉树的基本步骤:
```c
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 构建二叉树函数,例如插入一个新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 插入节点到已有的二叉树(这里假设有一个root指向根节点)
Node* insertIntoTree(Node* root, int value) {
// ...(根据需要添加递归插入逻辑)
}
```
对于前序、中序和后序遍历,我们分别编写三个递归函数:
```c
void preOrderTraversal(Node* node) {
if (node != NULL) {
printf("%d ", node->data); // 访问当前节点
preOrderTraversal(node->left); // 遍历左子树
preOrderTraversal(node->right); // 遍历右子树
}
}
void inOrderTraversal(Node* node) {
if (node != NULL) {
inOrderTraversal(node->left); // 遍历左子树
printf("%d ", node->data); // 访问当前节点
inOrderTraversal(node->right); // 遍历右子树
}
}
void postOrderTraversal(Node* node) {
if (node != NULL) {
postOrderTraversal(node->left); // 遍历左子树
postOrderTraversal(node->right); // 遍历右子树
printf("%d ", node->data); // 访问当前节点
}
}
```
层次遍历的实现则需要用到队列,可以使用`stdlib.h`库中的`queue`:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdlib.h>
// 使用队列实现层次遍历
void levelOrderTraversal(Node* root) {
if (root == NULL) {
return;
}
Node* queue[100]; // 假设队列大小足够大
int front = 0, rear = 0;
queue[rear++] = root; // 将根节点入队
while (front < rear) { // 只要队列不为空
Node* currentNode = queue[front++];
printf("%d ", currentNode->data);
// 添加子节点到队列
if (currentNode->left) {
queue[rear++] = currentNode->left;
}
if (currentNode->right) {
queue[rear++] = currentNode->right;
}
}
}
```
二叉树的前中后序遍历实现
二叉树的前、中、后序遍历是二叉树的三种基本遍历方式,它们的实现方式如下:
1. 前序遍历:
前序遍历的访问顺序是:根节点 -> 左子树 -> 右子树。实现方式如下:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def preorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
```
2. 中序遍历:
中序遍历的访问顺序是:左子树 -> 根节点 -> 右子树。实现方式如下:
```python
def inorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = []
while stack or root:
while root:
stack.append(root)
root = root.left
node = stack.pop()
res.append(node.val)
root = node.right
return res
```
3. 后序遍历:
后序遍历的访问顺序是:左子树 -> 右子树 -> 根节点。实现方式如下:
```python
def postorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
res.append(node.val)
return res[::-1]
```
以上代码中,使用了栈来实现二叉树的遍历。对于前序遍历和后序遍历,需要用到一个辅助栈来记录节点的访问顺序。对于中序遍历,也可以用栈来实现,每次将节点的左子树都入栈,直到左子树为空,再弹出栈顶元素,并将右子树入栈。
阅读全文