二叉树遍历大冒险

107 阅读3分钟

一、树与二叉树:自然界的数字映射

想象你正站在一片古老森林中,每棵树(数据结构中的"树")都从一根树干(根节点)向上生长,分出枝桠(子节点),再衍生出无数叶片(数据)。而二叉树是最守规矩的植物——每个枝桠最多分出两个新枝(左/右子节点),就像精心修剪过的盆景,既有序又充满可能性。

核心概念三重奏

  • 层次:根节点是第1层,它的子节点是第2层,如同家族的世世代代
  • 高度:从根部到最高叶片的垂直距离,就像摩天楼的层数
  • :每个节点的"生育能力",二叉树节点最多生两个"孩子"

二、遍历方式:四位性格迥异的探险家

1. 前序遍历(根左右)——急性子探险家

性格标签:#立即行动 #结果导向
行动模式


	var preorderTraversal = (root) => {

	    let result = [];

	    const traverse = (node) => {

	        if (node) {

	            result.push(node.val);  // 立刻标记当前位置

	            traverse(node.left);    // 冲向左边丛林

	            traverse(node.right);   // 转向右边峡谷

	        }

	    };

	    traverse(root);

	    return result;

	};

生活化场景
就像你走进迷宫,先在入口处涂鸦标记(处理根节点),然后直奔左边的走廊(左子树),探索完毕再折返右边通道(右子树)。这种模式适合需要先获取核心信息的场景,比如复制树结构或计算表达式值。

2. 中序遍历(左根右)——强迫症患者

性格标签:#按部就班 #完美主义
行动模式


	var inorderTraversal = function(root) {

	    let result = [];

	    const traverse = (node) => {

	        if (node) {

	            traverse(node.left);    // 先把左边整理得井井有条

	            result.push(node.val);  // 回到中间处理核心事务

	            traverse(node.right);   // 最后收拾右边残局

	        }

	    };

	    traverse(root);

	    return result;

	};

生活化场景
想象你在整理书房,先彻底收拾左边的书架(左子树),然后把中间书桌擦得一尘不染(处理根节点),最后整理右边的文件柜(右子树)。这种模式在二叉搜索树中会输出完美升序序列,就像自动整理好的书架。

3. 后序遍历(左右根)——完美主义者

性格标签:#善后专家 #延迟满足
行动模式

	var postorderTraversal = function(root) {

	    let result = [];

	    const traverse = (node) => {

	        if (node) {

	            traverse(node.left);    // 先帮左邻居打扫

	            traverse(node.right);   // 再帮右邻居收拾

	            result.push(node.val);  // 最后处理自己的事务

	        }

	    };

	    traverse(root);

	    return result;

	};

生活化场景
就像聚会结束时,你先帮左边朋友收拾餐具(左子树),再协助右边朋友穿外套(右子树),最后才拿起自己的物品离开(处理根节点)。这种模式适合需要先确保子系统安全再处理主系统的场景,比如释放内存或计算子树大小。

4. 层序遍历(广度优先)——社交达人

性格标签:#雨露均沾 #社交网络
行动模式

	var levelOrder = function(root) {

	    const queue = [root];

	    const res = [];

	    if (!root) return res;

	    

	    while (queue.length) {

	        const levelSize = queue.length;

	        const currentLevel = [];

	        for (let i = 0; i < levelSize; i++) {

	            const node = queue.shift();  // 邀请队列首位入场

	            currentLevel.push(node.val);

	            if (node.left) queue.push(node.left);  // 推荐新朋友加入

	            if (node.right) queue.push(node.right);

	        }

	        res.push(currentLevel);  // 记录本层社交成果

	    }

	    return res;

	};

生活化场景
就像举办一场派对,先邀请第1层的朋友(根节点),然后依次介绍他们的左邻右舍(左/右子节点)加入下一轮派对。每轮结束后拍照记录(保存层级结果),最终得到完整的社交网络图谱。这种模式适合需要计算层级均值或寻找最短路径的场景。

三、遍历背后的哲学

二叉树遍历就像人生选择:

  • 前序遍历教会我们把握当下,先处理核心问题再解决周边
  • 中序遍历提醒我们循序渐进,按自然顺序处理事务
  • 后序遍历诠释责任担当,先确保他人安全再顾自己
  • 层序遍历展现格局视野,从中心向外围逐步扩展影响力

下次当你面对二叉树时,不妨想象自己是个数字探险家,在代码的森林中寻找思维宝藏。