1、 null
2、 二叉树的递归理解:每个节点都可视为根节点,递归处理左右子树。
3、 代码实现细节
4、 若节点存在,则将其转换为布尔类型进行判断处理。
5、 6 }
6、 7 }
7、 代码说明若干要点
8、 divlist 是一个用于保存最终遍历结果的全局数组。对于不熟悉 JavaScript 的同学来说,node.firstElementChild 表示某个节点的第一个元素子节点,也就是其左孩子;而 node.lastElementChild 则表示最后一个元素子节点,即右孩子。这两个属性常用于在 DOM 树中进行左右子树的访问与操作,帮助实现对节点的顺序遍历和结构处理。
9、 二叉树用DOM结构进行模拟呈现
10、 递归包含递与归两个过程,前者深入,后者回溯。
11、 递表示按代码执行顺序进行,符合常规思维,易于理解。需要注意的是,在递的过程中,节点会依照访问顺序依次被压入堆栈中,为后续操作提供支持。
12、 归是在递达到终点后,依据递推过程中形成的堆栈依次回退计算,最终得出结果的过程。
13、 先序遍历二叉树时,包含两次递归调用,分别对应左右子树的遍历过程。
14、 最初传入的节点为1,随着程序逐步执行,在到达某一阶段末尾时,堆栈中将形成特定的调用结构。
15、 当左子树遍历完成后,第一阶段的遍历暂时结束。根据代码执行流程,接下来会调用 preorder(node.lastElementChild),开始处理右子树。由于节点4没有右孩子,程序将按出栈顺序依次访问节点2和1的右子树。为便于理解,此处再次展示相关代码片段,帮助说明整个遍历过程的推进逻辑与结构顺序。
16、 如果节点存在,则转换为布尔值进行判断处理。
17、 6 }
18、 7 }
19、 分析遍历过程中处理2的右子节点的具体步骤。
20、 当将2号节点传入preorder函数时,仅完成了对第一个子节点的遍历调用,即执行了preorder(node.firstElementChild);而对最后一个子节点的遍历调用preorder(node.lastElementChild)尚未执行。根据代码的执行流程,接下来应继续执行该语句,以完成对右子节点的访问和处理。
21、 执行步骤如下所示:
22、 此时栈中依次压入了5、6、7三个节点元素。
23、 总结
24、 递归并非难以理解,代码依然会执行,只是顺序不同于常规思维。它不断调用自身,直至满足终止条件,随后逐层回溯,最终返回初始调用点,完成整个过程。
