栈 | 树 | 深度优先搜索 | 链表 | 二叉树
你的思路和代码逻辑基本正确,利用递归将二叉树展开为单链表,同时保持先序遍历的顺序。下面我将对这个过程进行详细的讲解,包括思路、代码实现、以及更清晰的解释和示例。
问题分析
目标
将给定的二叉树展开为一个单链表,要求:
- 链表中的节点顺序与二叉树的先序遍历顺序一致。
- 链表的右指针指向下一个节点,左指针始终为
null。
先序遍历回顾
先序遍历的顺序是:
- 访问根节点
- 先序遍历左子树
- 先序遍历右子树
例如,对于以下二叉树:
1
/ \
2 5
/ \ \
3 4 6
先序遍历的顺序为:1 -> 2 -> 3 -> 4 -> 5 -> 6
代码实现
下面是实现该功能的代码:
// 定义二叉树节点
class TreeNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
// 展开二叉树为单链表
var flatten = function(root) {
// 递归终止条件
if (root === null) return null;
// 分别递归左右节点
const left = root.left; // 保存左子树
const right = root.right; // 保存右子树
flatten(left); // 递归处理左子树
flatten(right); // 递归处理右子树
// 将树的右节点替换为左节点
root.right = left; // 将左子树接到右边
root.left = null; // 左指针始终为 null
// 找到左子树的最右节点
let current = root;
while (current.right) {
current = current.right; // 遍历到右子树的最右节点
}
// 将最右节点的右指针指向原来的右子树
current.right = right;
};
// 示例测试
const buildSampleTree = () => {
const root = new TreeNode(1);
root.left = new

最低0.47元/天 解锁文章
911

被折叠的 条评论
为什么被折叠?



