Algorithms first
二叉树展开为链表 · 交互式算法学习
按前序遍历顺序原地展开为右指针链表。
#114 · 二叉树
二叉树展开为链表
Flatten Binary Tree to Linked List
root = [1,2,5,3,4,null,6]树 / 图3 个关键状态
步骤 1根 1 有左树,找到其最右节点 4。
pre=4推荐
寻找左子树最右节点
时间
O(n)空间 O(1)把原右子树接到左子树最右端,再把左树整体移到右边。
1function flatten(root) {2 let cur = root;3 while (cur) {4 if (cur.left) {5 let pre = cur.left;6 while (pre.right) pre = pre.right;7 pre.right = cur.right;8 cur.right = cur.left;9 cur.left = null;10 }11 cur = cur.right;12 }13}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1/**2 * Definition for a binary tree node.3 * public class TreeNode {4 * int val;5 * TreeNode left;6 * TreeNode right;7 * TreeNode() {}8 * TreeNode(int val) { this.val = val; }9 * TreeNode(int val, TreeNode left, TreeNode right) {10 * this.val = val;11 * this.left = left;12 * this.right = right;13 * }14 * }15 */16class Solution {17 public void flatten(TreeNode root) {18 while (root != null) {19 if (root.left != null) {20 // 找到当前节点左子树的最右节点21 TreeNode pre = root.left;22 while (pre.right != null) {23 pre = pre.right;24 }25 26 // 将左子树的最右节点指向原来的右子树27 pre.right = root.right;28 29 // 将当前节点指向左子树30 root.right = root.left;31 root.left = null;32 }33 root = root.right;34 }35 }36}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
二叉树展开为链表 · 解法对比
按前序遍历顺序原地展开为右指针链表。
- 测试用例
root = [1,2,5,3,4,null,6]- 题目分类
- 二叉树
- 解法对比
- 2
前序收集后重连
前序遍历保存节点数组,再清空 left 并连接 right。
- 时间
O(n)- 空间
O(n)
寻找左子树最右节点
把原右子树接到左子树最右端,再把左树整体移到右边。
- 时间
O(n)- 空间
O(1)