二叉树是一种重要的数据结构,在计算机科学和数学领域广泛应用。二叉树有三种常见的遍历方式:前序遍历、中序遍历和后序遍历。这篇文章将从多个角度分析二叉树前序中序后序的概念、应用和算法,并给出全文摘要和三个关键词。
一、概念
前序遍历,也称先序遍历,是指从根节点开始,先输出根节点,然后按照先左后右的顺序遍历左右子树。
中序遍历是指先遍历根节点的左子树,输出左子树中所有节点的值,然后输出根节点的值,最后遍历右子树。
后序遍历是指先遍历左右子树,然后输出根节点。可以理解为后序遍历是前序遍历和中序遍历的结合。
二、应用
二叉树的前序中序后序遍历算法在软件开发中经常用于树形结构的操作,例如树形菜单、拓扑排序等。在图形学和计算机游戏中,二叉树的遍历算法可以用于建立物体的层次结构。
三、算法
1. 前序遍历算法
前序遍历可以用递归或非递归的方式实现。递归实现的前序遍历代码如下:
```
void preorder(TreeNode* root) {
if (root != nullptr) {
cout << root->val << " "; // 输出根节点
preorder(root->left); // 遍历左子树
preorder(root->right); // 遍历右子树
}
}
```
非递归实现的前序遍历代码如下:
```
void preorder(TreeNode* root) {
stack
TreeNode* cur = root;
while (cur != nullptr || !s.empty()) {
if (cur != nullptr) {
cout << cur->val << " "; // 输出根节点
s.push(cur);
cur = cur->left; // 遍历左子树
} else {
cur = s.top(); // 遍历右子树
s.pop();
cur = cur->right;
}
}
}
```
2. 中序遍历算法
中序遍历同样可以用递归或非递归的方式实现。递归实现的代码如下:
```
void inorder(TreeNode* root) {
if (root != nullptr) {
inorder(root->left); // 遍历左子树
cout << root->val << " "; // 输出根节点
inorder(root->right); // 遍历右子树
}
}
```
非递归实现的中序遍历代码如下:
```
void inorder(TreeNode* root) {
stack
TreeNode* cur = root;
while (cur != nullptr || !s.empty()) {
if (cur != nullptr) {
s.push(cur);
cur = cur->left; // 遍历左子树
} else {
cur = s.top();
cout << cur->val << " "; // 输出根节点
s.pop();
cur = cur->right; // 遍历右子树
}
}
}
```
3. 后序遍历算法
后序遍历也可以用递归或非递归的方式实现。递归实现的代码如下:
```
void postorder(TreeNode* root) {
if (root != nullptr) {
postorder(root->left); // 遍历左子树
postorder(root->right); // 遍历右子树
cout << root->val << " "; // 输出根节点
}
}
```
非递归实现的后序遍历代码比较复杂,需要用到两个栈。具体实现可参考网上的代码。
扫码咨询 领取资料