C语言数据结构系列:二叉树遍历篇
- C语言数据结构系列(八):二叉树遍历------四种方式详解
-
- 一、前言
- 二、前序遍历
-
- [2.1 定义](#2.1 定义)
- [2.2 图解](#2.2 图解)
- [2.3 代码实现](#2.3 代码实现)
- [2.4 非递归实现(栈)](#2.4 非递归实现(栈))
- [2.5 遍历序列](#2.5 遍历序列)
- 三、中序遍历
-
- [3.1 定义](#3.1 定义)
- [3.2 图解](#3.2 图解)
- [3.3 代码实现](#3.3 代码实现)
- [3.4 非递归实现(栈)](#3.4 非递归实现(栈))
- [3.5 重要性质](#3.5 重要性质)
- [3.6 遍历序列](#3.6 遍历序列)
- 四、后序遍历
-
- [4.1 定义](#4.1 定义)
- [4.2 图解](#4.2 图解)
- [4.3 代码实现](#4.3 代码实现)
- [4.4 非递归实现(双栈)](#4.4 非递归实现(双栈))
- [4.5 应用场景](#4.5 应用场景)
- [4.6 遍历序列](#4.6 遍历序列)
- 五、层序遍历
-
- [5.1 定义](#5.1 定义)
- [5.2 图解](#5.2 图解)
- [5.3 代码实现(队列)](#5.3 代码实现(队列))
- [5.4 分层打印](#5.4 分层打印)
- [5.5 遍历序列](#5.5 遍历序列)
- 六、根据遍历序列构建二叉树
-
- [6.1 前序 + 中序](#6.1 前序 + 中序)
- [6.2 后序 + 中序](#6.2 后序 + 中序)
- [6.3 示例](#6.3 示例)
- 七、完整示例代码
- 八、遍历总结
- [九、练习题 🎯](#九、练习题 🎯)
-
- [🏠 基础题](#🏠 基础题)
- [💪 进阶题](#💪 进阶题)
- 十、总结
- 十一、下篇预告
C语言数据结构系列(八):二叉树遍历------四种方式详解
🎯 本篇目标 :深入理解二叉树的四种遍历方式,学会根据遍历序列构建二叉树!
📌 摘要:本文系统讲解二叉树的四种遍历方式------前序、中序、后序与层序遍历。每种遍历均从定义、图解、递归与非递归实现、遍历序列四个维度展开,并总结其典型应用场景。此外,还介绍了如何根据「前序+中序」或「后序+中序」遍历序列还原二叉树,最后附完整可运行的 C 语言示例代码与练习题,帮助读者从原理到实战全面掌握二叉树遍历。。
一、前言
哈喽小伙伴们!👋
上一篇我们学习了二叉树的基本概念,今天我们来深入学习遍历!
遍历就是"把所有节点都访问一遍",但是访问的顺序不同,就会产生不同的遍历结果。
#mermaid-svg-kAYL2AK0TGN4YA96{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kAYL2AK0TGN4YA96 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kAYL2AK0TGN4YA96 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kAYL2AK0TGN4YA96 .error-icon{fill:#552222;}#mermaid-svg-kAYL2AK0TGN4YA96 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kAYL2AK0TGN4YA96 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kAYL2AK0TGN4YA96 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kAYL2AK0TGN4YA96 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kAYL2AK0TGN4YA96 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kAYL2AK0TGN4YA96 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kAYL2AK0TGN4YA96 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kAYL2AK0TGN4YA96 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kAYL2AK0TGN4YA96 .marker.cross{stroke:#333333;}#mermaid-svg-kAYL2AK0TGN4YA96 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kAYL2AK0TGN4YA96 p{margin:0;}#mermaid-svg-kAYL2AK0TGN4YA96 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kAYL2AK0TGN4YA96 .cluster-label text{fill:#333;}#mermaid-svg-kAYL2AK0TGN4YA96 .cluster-label span{color:#333;}#mermaid-svg-kAYL2AK0TGN4YA96 .cluster-label span p{background-color:transparent;}#mermaid-svg-kAYL2AK0TGN4YA96 .label text,#mermaid-svg-kAYL2AK0TGN4YA96 span{fill:#333;color:#333;}#mermaid-svg-kAYL2AK0TGN4YA96 .node rect,#mermaid-svg-kAYL2AK0TGN4YA96 .node circle,#mermaid-svg-kAYL2AK0TGN4YA96 .node ellipse,#mermaid-svg-kAYL2AK0TGN4YA96 .node polygon,#mermaid-svg-kAYL2AK0TGN4YA96 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kAYL2AK0TGN4YA96 .rough-node .label text,#mermaid-svg-kAYL2AK0TGN4YA96 .node .label text,#mermaid-svg-kAYL2AK0TGN4YA96 .image-shape .label,#mermaid-svg-kAYL2AK0TGN4YA96 .icon-shape .label{text-anchor:middle;}#mermaid-svg-kAYL2AK0TGN4YA96 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kAYL2AK0TGN4YA96 .rough-node .label,#mermaid-svg-kAYL2AK0TGN4YA96 .node .label,#mermaid-svg-kAYL2AK0TGN4YA96 .image-shape .label,#mermaid-svg-kAYL2AK0TGN4YA96 .icon-shape .label{text-align:center;}#mermaid-svg-kAYL2AK0TGN4YA96 .node.clickable{cursor:pointer;}#mermaid-svg-kAYL2AK0TGN4YA96 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kAYL2AK0TGN4YA96 .arrowheadPath{fill:#333333;}#mermaid-svg-kAYL2AK0TGN4YA96 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kAYL2AK0TGN4YA96 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kAYL2AK0TGN4YA96 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kAYL2AK0TGN4YA96 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kAYL2AK0TGN4YA96 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kAYL2AK0TGN4YA96 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kAYL2AK0TGN4YA96 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kAYL2AK0TGN4YA96 .cluster text{fill:#333;}#mermaid-svg-kAYL2AK0TGN4YA96 .cluster span{color:#333;}#mermaid-svg-kAYL2AK0TGN4YA96 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kAYL2AK0TGN4YA96 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kAYL2AK0TGN4YA96 rect.text{fill:none;stroke-width:0;}#mermaid-svg-kAYL2AK0TGN4YA96 .icon-shape,#mermaid-svg-kAYL2AK0TGN4YA96 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kAYL2AK0TGN4YA96 .icon-shape p,#mermaid-svg-kAYL2AK0TGN4YA96 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kAYL2AK0TGN4YA96 .icon-shape .label rect,#mermaid-svg-kAYL2AK0TGN4YA96 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kAYL2AK0TGN4YA96 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kAYL2AK0TGN4YA96 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kAYL2AK0TGN4YA96 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1
2
3
4
5
6
7
让我们开始今天的学习吧! 🚀
二、前序遍历
2.1 定义
前序遍历(Pre-order) :根 → 左 → 右
先访问根节点,再递归左子树,最后递归右子树
2.2 图解
#mermaid-svg-RUNRHRihshxhYIC5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RUNRHRihshxhYIC5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RUNRHRihshxhYIC5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RUNRHRihshxhYIC5 .error-icon{fill:#552222;}#mermaid-svg-RUNRHRihshxhYIC5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RUNRHRihshxhYIC5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RUNRHRihshxhYIC5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RUNRHRihshxhYIC5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RUNRHRihshxhYIC5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RUNRHRihshxhYIC5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RUNRHRihshxhYIC5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RUNRHRihshxhYIC5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RUNRHRihshxhYIC5 .marker.cross{stroke:#333333;}#mermaid-svg-RUNRHRihshxhYIC5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RUNRHRihshxhYIC5 p{margin:0;}#mermaid-svg-RUNRHRihshxhYIC5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RUNRHRihshxhYIC5 .cluster-label text{fill:#333;}#mermaid-svg-RUNRHRihshxhYIC5 .cluster-label span{color:#333;}#mermaid-svg-RUNRHRihshxhYIC5 .cluster-label span p{background-color:transparent;}#mermaid-svg-RUNRHRihshxhYIC5 .label text,#mermaid-svg-RUNRHRihshxhYIC5 span{fill:#333;color:#333;}#mermaid-svg-RUNRHRihshxhYIC5 .node rect,#mermaid-svg-RUNRHRihshxhYIC5 .node circle,#mermaid-svg-RUNRHRihshxhYIC5 .node ellipse,#mermaid-svg-RUNRHRihshxhYIC5 .node polygon,#mermaid-svg-RUNRHRihshxhYIC5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RUNRHRihshxhYIC5 .rough-node .label text,#mermaid-svg-RUNRHRihshxhYIC5 .node .label text,#mermaid-svg-RUNRHRihshxhYIC5 .image-shape .label,#mermaid-svg-RUNRHRihshxhYIC5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-RUNRHRihshxhYIC5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RUNRHRihshxhYIC5 .rough-node .label,#mermaid-svg-RUNRHRihshxhYIC5 .node .label,#mermaid-svg-RUNRHRihshxhYIC5 .image-shape .label,#mermaid-svg-RUNRHRihshxhYIC5 .icon-shape .label{text-align:center;}#mermaid-svg-RUNRHRihshxhYIC5 .node.clickable{cursor:pointer;}#mermaid-svg-RUNRHRihshxhYIC5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RUNRHRihshxhYIC5 .arrowheadPath{fill:#333333;}#mermaid-svg-RUNRHRihshxhYIC5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RUNRHRihshxhYIC5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RUNRHRihshxhYIC5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RUNRHRihshxhYIC5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RUNRHRihshxhYIC5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RUNRHRihshxhYIC5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RUNRHRihshxhYIC5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RUNRHRihshxhYIC5 .cluster text{fill:#333;}#mermaid-svg-RUNRHRihshxhYIC5 .cluster span{color:#333;}#mermaid-svg-RUNRHRihshxhYIC5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RUNRHRihshxhYIC5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RUNRHRihshxhYIC5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-RUNRHRihshxhYIC5 .icon-shape,#mermaid-svg-RUNRHRihshxhYIC5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RUNRHRihshxhYIC5 .icon-shape p,#mermaid-svg-RUNRHRihshxhYIC5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RUNRHRihshxhYIC5 .icon-shape .label rect,#mermaid-svg-RUNRHRihshxhYIC5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RUNRHRihshxhYIC5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RUNRHRihshxhYIC5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RUNRHRihshxhYIC5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1 ✓ 第1个
2 ✓ 第2个
3 ✓ 第5个
4 ✓ 第3个
5 ✓ 第4个
6 ✓ 第6个
7 ✓ 第7个
2.3 代码实现
c
void preOrder(TreeNode *root) {
if (root == NULL) return;
printf("%c ", root->data); // 访问根
preOrder(root->left); // 遍历左
preOrder(root->right); // 遍历右
}
2.4 非递归实现(栈)
c
void preOrderIterative(TreeNode *root) {
if (root == NULL) return;
Stack s;
initStack(&s);
push(&s, root);
while (!isEmpty(&s)) {
TreeNode *node;
pop(&s, (int*)&node);
printf("%c ", node->data);
if (node->right) push(&s, node->right);
if (node->left) push(&s, node->left);
}
}
2.5 遍历序列
树结构:
1
/ \
2 3
/ \ / \
4 5 6 7
前序遍历: 1 2 4 5 3 6 7
三、中序遍历
3.1 定义
中序遍历(In-order) :左 → 根 → 右
先递归左子树,再访问根节点,最后递归右子树
3.2 图解
#mermaid-svg-zqYWs9uRn3aJffVB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zqYWs9uRn3aJffVB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zqYWs9uRn3aJffVB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zqYWs9uRn3aJffVB .error-icon{fill:#552222;}#mermaid-svg-zqYWs9uRn3aJffVB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zqYWs9uRn3aJffVB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zqYWs9uRn3aJffVB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zqYWs9uRn3aJffVB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zqYWs9uRn3aJffVB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zqYWs9uRn3aJffVB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zqYWs9uRn3aJffVB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zqYWs9uRn3aJffVB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zqYWs9uRn3aJffVB .marker.cross{stroke:#333333;}#mermaid-svg-zqYWs9uRn3aJffVB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zqYWs9uRn3aJffVB p{margin:0;}#mermaid-svg-zqYWs9uRn3aJffVB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zqYWs9uRn3aJffVB .cluster-label text{fill:#333;}#mermaid-svg-zqYWs9uRn3aJffVB .cluster-label span{color:#333;}#mermaid-svg-zqYWs9uRn3aJffVB .cluster-label span p{background-color:transparent;}#mermaid-svg-zqYWs9uRn3aJffVB .label text,#mermaid-svg-zqYWs9uRn3aJffVB span{fill:#333;color:#333;}#mermaid-svg-zqYWs9uRn3aJffVB .node rect,#mermaid-svg-zqYWs9uRn3aJffVB .node circle,#mermaid-svg-zqYWs9uRn3aJffVB .node ellipse,#mermaid-svg-zqYWs9uRn3aJffVB .node polygon,#mermaid-svg-zqYWs9uRn3aJffVB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zqYWs9uRn3aJffVB .rough-node .label text,#mermaid-svg-zqYWs9uRn3aJffVB .node .label text,#mermaid-svg-zqYWs9uRn3aJffVB .image-shape .label,#mermaid-svg-zqYWs9uRn3aJffVB .icon-shape .label{text-anchor:middle;}#mermaid-svg-zqYWs9uRn3aJffVB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zqYWs9uRn3aJffVB .rough-node .label,#mermaid-svg-zqYWs9uRn3aJffVB .node .label,#mermaid-svg-zqYWs9uRn3aJffVB .image-shape .label,#mermaid-svg-zqYWs9uRn3aJffVB .icon-shape .label{text-align:center;}#mermaid-svg-zqYWs9uRn3aJffVB .node.clickable{cursor:pointer;}#mermaid-svg-zqYWs9uRn3aJffVB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zqYWs9uRn3aJffVB .arrowheadPath{fill:#333333;}#mermaid-svg-zqYWs9uRn3aJffVB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zqYWs9uRn3aJffVB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zqYWs9uRn3aJffVB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zqYWs9uRn3aJffVB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zqYWs9uRn3aJffVB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zqYWs9uRn3aJffVB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zqYWs9uRn3aJffVB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zqYWs9uRn3aJffVB .cluster text{fill:#333;}#mermaid-svg-zqYWs9uRn3aJffVB .cluster span{color:#333;}#mermaid-svg-zqYWs9uRn3aJffVB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zqYWs9uRn3aJffVB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zqYWs9uRn3aJffVB rect.text{fill:none;stroke-width:0;}#mermaid-svg-zqYWs9uRn3aJffVB .icon-shape,#mermaid-svg-zqYWs9uRn3aJffVB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zqYWs9uRn3aJffVB .icon-shape p,#mermaid-svg-zqYWs9uRn3aJffVB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zqYWs9uRn3aJffVB .icon-shape .label rect,#mermaid-svg-zqYWs9uRn3aJffVB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zqYWs9uRn3aJffVB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zqYWs9uRn3aJffVB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zqYWs9uRn3aJffVB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1
2
3
4 ✓ 第1个
5 ✓ 第3个
6 ✓ 第5个
7 ✓ 第7个
3.3 代码实现
c
void inOrder(TreeNode *root) {
if (root == NULL) return;
inOrder(root->left); // 遍历左
printf("%c ", root->data); // 访问根
inOrder(root->right); // 遍历右
}
3.4 非递归实现(栈)
c
void inOrderIterative(TreeNode *root) {
Stack s;
initStack(&s);
TreeNode *current = root;
while (current != NULL || !isEmpty(&s)) {
while (current != NULL) {
push(&s, current);
current = current->left;
}
TreeNode *node;
pop(&s, (int*)&node);
printf("%c ", node->data);
current = node->right;
}
}
3.5 重要性质
💡 二叉搜索树的中序遍历结果是有序的!
BST:
4
/ \
2 6
/ \ / \
1 3 5 7
中序遍历: 1 2 3 4 5 6 7 (升序!)
3.6 遍历序列
树结构:
1
/ \
2 3
/ \ / \
4 5 6 7
中序遍历: 4 2 5 1 6 3 7
四、后序遍历
4.1 定义
后序遍历(Post-order) :左 → 右 → 根
先递归左子树,再递归右子树,最后访问根节点
4.2 图解
#mermaid-svg-BpiujVLHwjkZZG1A{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BpiujVLHwjkZZG1A .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BpiujVLHwjkZZG1A .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BpiujVLHwjkZZG1A .error-icon{fill:#552222;}#mermaid-svg-BpiujVLHwjkZZG1A .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BpiujVLHwjkZZG1A .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BpiujVLHwjkZZG1A .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BpiujVLHwjkZZG1A .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BpiujVLHwjkZZG1A .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BpiujVLHwjkZZG1A .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BpiujVLHwjkZZG1A .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BpiujVLHwjkZZG1A .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BpiujVLHwjkZZG1A .marker.cross{stroke:#333333;}#mermaid-svg-BpiujVLHwjkZZG1A svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BpiujVLHwjkZZG1A p{margin:0;}#mermaid-svg-BpiujVLHwjkZZG1A .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BpiujVLHwjkZZG1A .cluster-label text{fill:#333;}#mermaid-svg-BpiujVLHwjkZZG1A .cluster-label span{color:#333;}#mermaid-svg-BpiujVLHwjkZZG1A .cluster-label span p{background-color:transparent;}#mermaid-svg-BpiujVLHwjkZZG1A .label text,#mermaid-svg-BpiujVLHwjkZZG1A span{fill:#333;color:#333;}#mermaid-svg-BpiujVLHwjkZZG1A .node rect,#mermaid-svg-BpiujVLHwjkZZG1A .node circle,#mermaid-svg-BpiujVLHwjkZZG1A .node ellipse,#mermaid-svg-BpiujVLHwjkZZG1A .node polygon,#mermaid-svg-BpiujVLHwjkZZG1A .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BpiujVLHwjkZZG1A .rough-node .label text,#mermaid-svg-BpiujVLHwjkZZG1A .node .label text,#mermaid-svg-BpiujVLHwjkZZG1A .image-shape .label,#mermaid-svg-BpiujVLHwjkZZG1A .icon-shape .label{text-anchor:middle;}#mermaid-svg-BpiujVLHwjkZZG1A .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BpiujVLHwjkZZG1A .rough-node .label,#mermaid-svg-BpiujVLHwjkZZG1A .node .label,#mermaid-svg-BpiujVLHwjkZZG1A .image-shape .label,#mermaid-svg-BpiujVLHwjkZZG1A .icon-shape .label{text-align:center;}#mermaid-svg-BpiujVLHwjkZZG1A .node.clickable{cursor:pointer;}#mermaid-svg-BpiujVLHwjkZZG1A .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BpiujVLHwjkZZG1A .arrowheadPath{fill:#333333;}#mermaid-svg-BpiujVLHwjkZZG1A .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BpiujVLHwjkZZG1A .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BpiujVLHwjkZZG1A .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BpiujVLHwjkZZG1A .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BpiujVLHwjkZZG1A .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BpiujVLHwjkZZG1A .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BpiujVLHwjkZZG1A .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BpiujVLHwjkZZG1A .cluster text{fill:#333;}#mermaid-svg-BpiujVLHwjkZZG1A .cluster span{color:#333;}#mermaid-svg-BpiujVLHwjkZZG1A div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BpiujVLHwjkZZG1A .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BpiujVLHwjkZZG1A rect.text{fill:none;stroke-width:0;}#mermaid-svg-BpiujVLHwjkZZG1A .icon-shape,#mermaid-svg-BpiujVLHwjkZZG1A .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BpiujVLHwjkZZG1A .icon-shape p,#mermaid-svg-BpiujVLHwjkZZG1A .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BpiujVLHwjkZZG1A .icon-shape .label rect,#mermaid-svg-BpiujVLHwjkZZG1A .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BpiujVLHwjkZZG1A .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BpiujVLHwjkZZG1A .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BpiujVLHwjkZZG1A :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1 ✓ 第7个
2 ✓ 第3个
3 ✓ 第6个
4 ✓ 第1个
5 ✓ 第2个
6 ✓ 第4个
7 ✓ 第5个
4.3 代码实现
c
void postOrder(TreeNode *root) {
if (root == NULL) return;
postOrder(root->left); // 遍历左
postOrder(root->right); // 遍历右
printf("%c ", root->data); // 访问根
}
4.4 非递归实现(双栈)
c
void postOrderIterative(TreeNode *root) {
if (root == NULL) return;
Stack s1, s2;
initStack(&s1);
initStack(&s2);
push(&s1, root);
while (!isEmpty(&s1)) {
TreeNode *node;
pop(&s1, (int*)&node);
push(&s2, node);
if (node->left) push(&s1, node->left);
if (node->right) push(&s1, node->right);
}
while (!isEmpty(&s2)) {
TreeNode *node;
pop(&s2, (int*)&node);
printf("%c ", node->data);
}
}
4.5 应用场景
- 删除二叉树:先删孩子再删根
- 计算目录大小:先算子目录再算父目录
- 表达式求值:后缀表达式
4.6 遍历序列
树结构:
1
/ \
2 3
/ \ / \
4 5 6 7
后序遍历: 4 5 2 6 7 3 1
五、层序遍历
5.1 定义
层序遍历(Level-order):按层从上到下,每层从左到右访问
使用队列实现(BFS)
5.2 图解
#mermaid-svg-sbHVejbfUiTulsBV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sbHVejbfUiTulsBV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sbHVejbfUiTulsBV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sbHVejbfUiTulsBV .error-icon{fill:#552222;}#mermaid-svg-sbHVejbfUiTulsBV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sbHVejbfUiTulsBV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sbHVejbfUiTulsBV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sbHVejbfUiTulsBV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sbHVejbfUiTulsBV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sbHVejbfUiTulsBV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sbHVejbfUiTulsBV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sbHVejbfUiTulsBV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sbHVejbfUiTulsBV .marker.cross{stroke:#333333;}#mermaid-svg-sbHVejbfUiTulsBV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sbHVejbfUiTulsBV p{margin:0;}#mermaid-svg-sbHVejbfUiTulsBV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sbHVejbfUiTulsBV .cluster-label text{fill:#333;}#mermaid-svg-sbHVejbfUiTulsBV .cluster-label span{color:#333;}#mermaid-svg-sbHVejbfUiTulsBV .cluster-label span p{background-color:transparent;}#mermaid-svg-sbHVejbfUiTulsBV .label text,#mermaid-svg-sbHVejbfUiTulsBV span{fill:#333;color:#333;}#mermaid-svg-sbHVejbfUiTulsBV .node rect,#mermaid-svg-sbHVejbfUiTulsBV .node circle,#mermaid-svg-sbHVejbfUiTulsBV .node ellipse,#mermaid-svg-sbHVejbfUiTulsBV .node polygon,#mermaid-svg-sbHVejbfUiTulsBV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sbHVejbfUiTulsBV .rough-node .label text,#mermaid-svg-sbHVejbfUiTulsBV .node .label text,#mermaid-svg-sbHVejbfUiTulsBV .image-shape .label,#mermaid-svg-sbHVejbfUiTulsBV .icon-shape .label{text-anchor:middle;}#mermaid-svg-sbHVejbfUiTulsBV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sbHVejbfUiTulsBV .rough-node .label,#mermaid-svg-sbHVejbfUiTulsBV .node .label,#mermaid-svg-sbHVejbfUiTulsBV .image-shape .label,#mermaid-svg-sbHVejbfUiTulsBV .icon-shape .label{text-align:center;}#mermaid-svg-sbHVejbfUiTulsBV .node.clickable{cursor:pointer;}#mermaid-svg-sbHVejbfUiTulsBV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sbHVejbfUiTulsBV .arrowheadPath{fill:#333333;}#mermaid-svg-sbHVejbfUiTulsBV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sbHVejbfUiTulsBV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sbHVejbfUiTulsBV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sbHVejbfUiTulsBV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sbHVejbfUiTulsBV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sbHVejbfUiTulsBV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sbHVejbfUiTulsBV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sbHVejbfUiTulsBV .cluster text{fill:#333;}#mermaid-svg-sbHVejbfUiTulsBV .cluster span{color:#333;}#mermaid-svg-sbHVejbfUiTulsBV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sbHVejbfUiTulsBV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sbHVejbfUiTulsBV rect.text{fill:none;stroke-width:0;}#mermaid-svg-sbHVejbfUiTulsBV .icon-shape,#mermaid-svg-sbHVejbfUiTulsBV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sbHVejbfUiTulsBV .icon-shape p,#mermaid-svg-sbHVejbfUiTulsBV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sbHVejbfUiTulsBV .icon-shape .label rect,#mermaid-svg-sbHVejbfUiTulsBV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sbHVejbfUiTulsBV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sbHVejbfUiTulsBV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sbHVejbfUiTulsBV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 第1层: 1
第2层: 2
第2层: 3
第3层: 4
第3层: 5
第3层: 6
第3层: 7
5.3 代码实现(队列)
c
void levelOrder(TreeNode *root) {
if (root == NULL) return;
Queue q;
initQueue(&q);
enqueue(&q, root);
while (!isEmpty(&q)) {
TreeNode *node;
dequeue(&q, (int*)&node);
printf("%c ", node->data);
if (node->left) enqueue(&q, node->left);
if (node->right) enqueue(&q, node->right);
}
}
5.4 分层打印
c
void levelOrderPrint(TreeNode *root) {
if (root == NULL) return;
Queue q;
initQueue(&q);
enqueue(&q, root);
int level = 1;
while (!isEmpty(&q)) {
printf("第%d层: ", level);
int size = q.size; // 当前层的节点数
for (int i = 0; i < size; i++) {
TreeNode *node;
dequeue(&q, (int*)&node);
printf("%c ", node->data);
if (node->left) enqueue(&q, node->left);
if (node->right) enqueue(&q, node->right);
}
printf("\n");
level++;
}
}
5.5 遍历序列
树结构:
1
/ \
2 3
/ \ / \
4 5 6 7
层序遍历: 1 2 3 4 5 6 7
六、根据遍历序列构建二叉树
6.1 前序 + 中序
💡 思路:前序第一个是根,在中序中找到根的位置,划分左右子树
c
TreeNode* buildTree(int *preorder, int *inorder, int preStart, int preEnd,
int inStart, int inEnd) {
if (preStart > preEnd) return NULL;
// 前序第一个是根
int rootVal = preorder[preStart];
TreeNode *root = createNode(rootVal);
// 在中序中找到根的位置
int rootIndex;
for (rootIndex = inStart; rootIndex <= inEnd; rootIndex++) {
if (inorder[rootIndex] == rootVal) break;
}
// 左子树节点数
int leftSize = rootIndex - inStart;
// 递归构建
root->left = buildTree(preorder, inorder,
preStart + 1, preStart + leftSize,
inStart, rootIndex - 1);
root->right = buildTree(preorder, inorder,
preStart + leftSize + 1, preEnd,
rootIndex + 1, inEnd);
return root;
}
6.2 后序 + 中序
💡 思路:后序最后一个是根
c
TreeNode* buildTree(int *postorder, int *inorder, int postStart, int postEnd,
int inStart, int inEnd) {
if (postStart > postEnd) return NULL;
int rootVal = postorder[postEnd];
TreeNode *root = createNode(rootVal);
int rootIndex;
for (rootIndex = inStart; rootIndex <= inEnd; rootIndex++) {
if (inorder[rootIndex] == rootVal) break;
}
int leftSize = rootIndex - inStart;
root->left = buildTree(postorder, inorder,
postStart, postStart + leftSize - 1,
inStart, rootIndex - 1);
root->right = buildTree(postorder, inorder,
postStart + leftSize, postEnd - 1,
rootIndex + 1, inEnd);
return root;
}
6.3 示例
前序: [1, 2, 4, 5, 3, 6, 7]
中序: [4, 2, 5, 1, 6, 3, 7]
构建过程:
1. 前序第一个1是根
2. 中序中1的位置是3,左边[4,2,5]是左子树,右边[6,3,7]是右子树
3. 递归处理左子树和右子树
七、完整示例代码
c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 栈
typedef struct {
TreeNode *data[MAX_SIZE];
int top;
} Stack;
void initStack(Stack *s) { s->top = -1; }
int isEmpty(Stack *s) { return s->top == -1; }
void push(Stack *s, TreeNode *node) { s->data[++s->top] = node; }
TreeNode* pop(Stack *s) { return s->data[s->top--]; }
// 队列
typedef struct {
TreeNode *data[MAX_SIZE];
int front, rear;
} Queue;
void initQueue(Queue *q) { q->front = 0; q->rear = 0; }
int isEmpty(Queue *q) { return q->front == q->rear; }
void enqueue(Queue *q, TreeNode *node) { q->data[q->rear++] = node; }
TreeNode* dequeue(Queue *q) { return q->data[q->front++]; }
// 创建节点
TreeNode* createNode(char data) {
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 构建二叉树
TreeNode* buildTree() {
TreeNode *A = createNode('A');
TreeNode *B = createNode('B');
TreeNode *C = createNode('C');
TreeNode *D = createNode('D');
TreeNode *E = createNode('E');
TreeNode *F = createNode('F');
TreeNode *G = createNode('G');
A->left = B; A->right = C;
B->left = D; B->right = E;
C->left = F; C->right = G;
return A;
}
// 前序遍历(递归)
void preOrder(TreeNode *root) {
if (root == NULL) return;
printf("%c ", root->data);
preOrder(root->left);
preOrder(root->right);
}
// 中序遍历(递归)
void inOrder(TreeNode *root) {
if (root == NULL) return;
inOrder(root->left);
printf("%c ", root->data);
inOrder(root->right);
}
// 后序遍历(递归)
void postOrder(TreeNode *root) {
if (root == NULL) return;
postOrder(root->left);
postOrder(root->right);
printf("%c ", root->data);
}
// 层序遍历(队列)
void levelOrder(TreeNode *root) {
if (root == NULL) return;
Queue q;
initQueue(&q);
enqueue(&q, root);
while (!isEmpty(&q)) {
TreeNode *node = dequeue(&q);
printf("%c ", node->data);
if (node->left) enqueue(&q, node->left);
if (node->right) enqueue(&q, node->right);
}
}
// 非递归前序
void preOrderIterative(TreeNode *root) {
Stack s;
initStack(&s);
push(&s, root);
while (!isEmpty(&s)) {
TreeNode *node = pop(&s);
printf("%c ", node->data);
if (node->right) push(&s, node->right);
if (node->left) push(&s, node->left);
}
}
// 非递归中序
void inOrderIterative(TreeNode *root) {
Stack s;
initStack(&s);
TreeNode *current = root;
while (current || !isEmpty(&s)) {
while (current) {
push(&s, current);
current = current->left;
}
TreeNode *node = pop(&s);
printf("%c ", node->data);
current = node->right;
}
}
int main() {
TreeNode *root = buildTree();
printf("===== 二叉树遍历演示 =====\n\n");
printf("树结构:\n");
printf(" A\n");
printf(" / \\\n");
printf(" B C\n");
printf(" / \\ / \\\n");
printf(" D E F G\n\n");
printf("前序遍历(递归): ");
preOrder(root);
printf("\n");
printf("前序遍历(栈): ");
preOrderIterative(root);
printf("\n\n");
printf("中序遍历(递归): ");
inOrder(root);
printf("\n");
printf("中序遍历(栈): ");
inOrderIterative(root);
printf("\n\n");
printf("后序遍历(递归): ");
postOrder(root);
printf("\n\n");
printf("层序遍历(队列): ");
levelOrder(root);
printf("\n");
return 0;
}
八、遍历总结
| 遍历方式 | 顺序 | 用途 |
|---|---|---|
| 前序 | 根→左→右 | 复制二叉树、前缀表达式 |
| 中序 | 左→根→右 | BST有序输出 |
| 后序 | 左→右→根 | 删除树、后缀表达式 |
| 层序 | 逐层BFS | 最短路径、层序处理 |
如何记忆:
- 前序:根在前
- 中序:根在中
- 后序:根在后
九、练习题 🎯
🏠 基础题
题目1:前序遍历求叶子数
c
int countLeaves(TreeNode *root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right == NULL) return 1;
return countLeaves(root->left) + countLeaves(root->right);
}
题目2:交换二叉树的左右子树
c
void mirror(TreeNode *root) {
if (root == NULL) return;
TreeNode *temp = root->left;
root->left = root->right;
root->right = temp;
mirror(root->left);
mirror(root->right);
}
💪 进阶题
题目3:从前序和中序构建二叉树
LeetCode 105
题目4:验证二叉搜索树
LeetCode 98
十、总结
今天我们深入学习了二叉树的四种遍历:
✅ 前序遍历:根→左→右,用于复制树
✅ 中序遍历:左→根→右,BST有序输出
✅ 后序遍历:左→右→根,用于删除树
✅ 层序遍历:BFS,使用队列
✅ 构建二叉树:前序+中序 或 后序+中序
关键点:
- 递归实现简洁
- 非递归需要栈/队列
- 中序遍历BST是有序的
- 遍历序列不能唯一确定二叉树(需要两个遍历)
十一、下篇预告
下一篇我们将学习 二叉搜索树(BST)------高效的查找数据结构!
#mermaid-svg-CyawpYIOcE9KidlL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CyawpYIOcE9KidlL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CyawpYIOcE9KidlL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CyawpYIOcE9KidlL .error-icon{fill:#552222;}#mermaid-svg-CyawpYIOcE9KidlL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CyawpYIOcE9KidlL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CyawpYIOcE9KidlL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CyawpYIOcE9KidlL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CyawpYIOcE9KidlL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CyawpYIOcE9KidlL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CyawpYIOcE9KidlL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CyawpYIOcE9KidlL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CyawpYIOcE9KidlL .marker.cross{stroke:#333333;}#mermaid-svg-CyawpYIOcE9KidlL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CyawpYIOcE9KidlL p{margin:0;}#mermaid-svg-CyawpYIOcE9KidlL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CyawpYIOcE9KidlL .cluster-label text{fill:#333;}#mermaid-svg-CyawpYIOcE9KidlL .cluster-label span{color:#333;}#mermaid-svg-CyawpYIOcE9KidlL .cluster-label span p{background-color:transparent;}#mermaid-svg-CyawpYIOcE9KidlL .label text,#mermaid-svg-CyawpYIOcE9KidlL span{fill:#333;color:#333;}#mermaid-svg-CyawpYIOcE9KidlL .node rect,#mermaid-svg-CyawpYIOcE9KidlL .node circle,#mermaid-svg-CyawpYIOcE9KidlL .node ellipse,#mermaid-svg-CyawpYIOcE9KidlL .node polygon,#mermaid-svg-CyawpYIOcE9KidlL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CyawpYIOcE9KidlL .rough-node .label text,#mermaid-svg-CyawpYIOcE9KidlL .node .label text,#mermaid-svg-CyawpYIOcE9KidlL .image-shape .label,#mermaid-svg-CyawpYIOcE9KidlL .icon-shape .label{text-anchor:middle;}#mermaid-svg-CyawpYIOcE9KidlL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CyawpYIOcE9KidlL .rough-node .label,#mermaid-svg-CyawpYIOcE9KidlL .node .label,#mermaid-svg-CyawpYIOcE9KidlL .image-shape .label,#mermaid-svg-CyawpYIOcE9KidlL .icon-shape .label{text-align:center;}#mermaid-svg-CyawpYIOcE9KidlL .node.clickable{cursor:pointer;}#mermaid-svg-CyawpYIOcE9KidlL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CyawpYIOcE9KidlL .arrowheadPath{fill:#333333;}#mermaid-svg-CyawpYIOcE9KidlL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CyawpYIOcE9KidlL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CyawpYIOcE9KidlL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CyawpYIOcE9KidlL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CyawpYIOcE9KidlL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CyawpYIOcE9KidlL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CyawpYIOcE9KidlL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CyawpYIOcE9KidlL .cluster text{fill:#333;}#mermaid-svg-CyawpYIOcE9KidlL .cluster span{color:#333;}#mermaid-svg-CyawpYIOcE9KidlL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CyawpYIOcE9KidlL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CyawpYIOcE9KidlL rect.text{fill:none;stroke-width:0;}#mermaid-svg-CyawpYIOcE9KidlL .icon-shape,#mermaid-svg-CyawpYIOcE9KidlL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CyawpYIOcE9KidlL .icon-shape p,#mermaid-svg-CyawpYIOcE9KidlL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CyawpYIOcE9KidlL .icon-shape .label rect,#mermaid-svg-CyawpYIOcE9KidlL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CyawpYIOcE9KidlL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CyawpYIOcE9KidlL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CyawpYIOcE9KidlL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 4
2
6
1
3
5
7
BST让查找效率提升到O(logn),让我们拭目以待! 🚀
💡 学习建议:遍历是树的基础,一定要熟练掌握!
觉得有帮助就点赞+收藏+关注吧! 👍
有问题欢迎在评论区留言~ 💬