114. 二叉树展开为链表(中)
题目
- 给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
法一、前序遍历+数组存值
var flatten = function(root) {
const list =[]//存储前序遍历的结果
preorderTraversal(root, list)//前序遍历
const size = list.length//数组长度
for(let i=1;i<size;i++){//遍历数组
//确定节点
const prev=list[i-1],cur=list[i]
//确定节点的连接
prev.left=null
prev.right=cur
}
};
//前序遍历的具体实现
const preorderTraversal=(root,list)=>{
if(root === null) return
list.push(root)
preorderTraversal(root.left,list)
preorderTraversal(root.right,list)
}
法二、找前驱节点
var flatten = function(root) {
// 将当前节点初始化为根节点
let curr = root;
// 当当前节点不为空时,继续遍历
while (curr !== null) {
// 如果当前节点的左子树不为空
if (curr.left !== null) {
// 保存左子树的根节点
const next = curr.left;
// 初始化前驱节点为左子树的根节点
let predecessor = next;
// 找到左子树的最右节点
while (predecessor.right !== null) {
predecessor = predecessor.right; // 移动到右子节点
}
// 将原右子树连接到左子树的最右节点
predecessor.right = curr.right;
// 清空当前节点的左子树
curr.left = null;
// 将左子树的根节点移到当前节点的右侧
curr.right = next;
}
// 当前节点的左子树为空:移动到当前节点的右子节点,继续处理
curr = curr.right;
}
};
标签:
力扣
, 力扣hot100-js
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人