Python实现树的先序、中序和后序遍历详解
需积分: 10 125 浏览量
更新于2024-09-03
收藏 649KB DOCX 举报
在计算机科学中,树是一种重要的数据结构,常用于许多算法和编程问题中,特别是在搜索、排序和图论等领域。树的基本结构由节点(或顶点)和边组成,每个节点可以有零个或多个子节点。这里我们将探讨三种常见的二叉树遍历方法:先序遍历、中序遍历和后序遍历,这些都是在处理树形数据时的基础操作。
1. **先序遍历(Preorder Traversal)**
先序遍历是访问根节点、然后递归地访问左子树,最后访问右子树。在给定的代码片段中,使用栈来实现这个过程。通过`stack<TreeNode*> st;`存储待访问的节点,首先将根节点入栈,然后进入一个循环,当栈不为空时,取出栈顶节点,访问其值并将其子节点按照“右-左”的顺序入栈。这样保证了先访问根节点,再遍历左子树,最后遍历右子树。例如:
```cpp
vector<int> preorderTraversal(TreeNode* root) {
vector<int> rst;
if (!root) return rst;
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
rst.push_back(node->val);
if (node->right) st.push(node->right);
if (node->left) st.push(node->left);
}
return rst;
}
```
2. **中序遍历(Inorder Traversal)**
中序遍历的顺序是先递归地访问左子树、然后访问根节点,最后访问右子树。代码中使用两个嵌套的`while`循环实现。外部循环用于遍历直到遇到空节点,内部循环则确保一直把节点压入栈,直到到达最左边的节点。然后弹出栈顶节点,访问其值,接着移动到右子树。这样就保证了按左-根-右的顺序遍历。
```cpp
vector<int> inorderTraversal(TreeNode* root) {
vector<int> rst;
if (!root) return rst;
stack<TreeNode*> st;
while (!st.empty() || root) {
while (root) {
st.push(root);
root = root->left;
}
root = st.top();
st.pop();
rst.push_back(root->val);
root = root->right;
}
return rst;
}
```
3. **后序遍历(Postorder Traversal)**
后序遍历遵循左子树、右子树、根节点的顺序。这里同样使用栈,但策略不同。首先将根节点入栈,然后按“左-右”的顺序将节点入栈,但访问时遵循后序规则。因此,需要先弹出所有子节点,再访问根节点。代码中的`reverse`函数就是用来反转存储结果的向量,使得访问顺序符合后序规则。
```cpp
vector<int> postorderTraversal(TreeNode* root) {
vector<int> re;
if (root == NULL) return re;
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
// ... (类似前两种方法的循环)
}
// 使用reverse函数反转re,得到后序遍历结果
reverse(re.begin(), re.end());
return re;
}
```
总结来说,理解这些基本的二叉树遍历方法对编程非常重要,它们不仅在LeetCode等在线编程平台上常被作为面试题,也是许多高级算法的基础。掌握这些遍历方式有助于在构建搜索算法、构建二叉树数据结构、以及解决与树相关的问题时游刃有余。
点击了解资源详情
2140 浏览量
152 浏览量
229 浏览量
2024-01-10 上传
416 浏览量
2022-07-19 上传
168 浏览量
2023-02-22 上传
vindy_若飞呀
- 粉丝: 1
- 资源: 20
最新资源
- 搜索引擎_原理技术与系统
- Java语言编码规范(Java+Code+Conventions).
- 新东方词根词缀大全.pdf
- MIT How to do Research
- 浙大计算机硬件课程改革
- c语言部分方法介绍资料
- IDES安装中文系统步骤祥解
- 利用logistic模型预测移动电话发展
- C++徐孝凯习题解答.txt
- ARM入门教程 轻松学ARM
- Eclipse Web Tools Platform 英文版 (pdf)
- 轻量级ORM-Persister使用指南(英文版)
- verilog黄金参考指南中文版
- [浪曦.J2EE.Struts.2应用开发详解系列视频2008_4_29更新].Practical.Apache.Struts2.Web.2.0.Projects.pdf
- Asp.net页面之间传递参数的几种方法
- VS2005(c#)项目调试问题解决方案集锦