08-二叉树遍历:四种方式详解

C语言数据结构系列:二叉树遍历篇

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),让我们拭目以待! 🚀


💡 学习建议:遍历是树的基础,一定要熟练掌握!

觉得有帮助就点赞+收藏+关注吧! 👍

有问题欢迎在评论区留言~ 💬

相关推荐
咸鱼老弟1 小时前
Speculative Decoding(投机采样):大模型"先猜后验",生成速度翻倍
前端·算法·ai编程
ocean21031 小时前
2025-2026年C语言专题面试高频知识点洞察
c语言·面试·面试经验
荆棘鸟智能1 小时前
AI算法持续学习与迭代怎么做?从数据闭环到灰度发布的MLOps工程实践
人工智能·算法·架构·边缘计算
Lyyaoo.1 小时前
【二分查找】【中等】搜索二维矩阵/排序数组的第一位和最后位置/搜索旋转排序数组/旋转排序数组中的最小值
java·数据结构·算法
土司大王1 小时前
LeetCode hot100——153.寻找旋转排序数组中的最小值:Java 二分模板与 O(log n) 分析
java·算法·leetcode
光电的一只菜鸡1 小时前
isp中关于锐化对图像清晰度的影响
算法
土司大王2 小时前
LeetCode hot100——4.寻找两个正序数组的中位数:Java 二分第K小 递归裁剪
java·算法·leetcode
薛定e的猫咪2 小时前
(ICML2024)QSM:基于 Q 函数梯度对齐分数场的扩散模型离策略强化学习
人工智能·深度学习·算法