> LeetCode:二叉树展开为链表_114 - Yuyy
Yuyy
Yuyy
LeetCode:二叉树展开为链表_114

思路

最终需要的结果是前序遍历,最简单的方式就是递归前序遍历,结果存到队列里,最后再组装。难一点的就是一边遍历一边组装结果,如果是递归,遍历左节点时,将父节点的右节点更改为左节点(题目要求的结果),那么会影响右节点的遍历(已经被替换成左节点了)。所以这里用迭代遍历,将遍历顺序存到了栈里,不用担心修改父节点影响遍历了。

题目

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

 

示例 1:

https://assets.leetcode.com/uploads/2021/01/14/flaten.jpg

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [0]
输出:[0]

 

提示:

  • 树中结点数在范围 [0, 2000]
  • -100 <= Node.val <= 100

 

进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?

Related Topics
  • 深度优先搜索
  • 链表
  • 二叉树
  • 👍 905
  • 👎 0
  • 代码

        public void flatten(TreeNode root) {
            if (root == null) {
                return;
            }
            TreeNode pre = null;
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while (!stack.isEmpty()) {
                final TreeNode curr = stack.pop();
                // 设置上一个节点的right为当前节点,也就是本题需要的结果
                if (pre != null) {
                    pre.left = null;
                    pre.right = curr;
                }
    
                if (curr.right != null) {
                    stack.push(curr.right);
                }
                if (curr.left != null) {
                    stack.push(curr.left);
                }
                pre = curr;
            }
        }
    

    发表评论

    textsms
    account_circle
    email

    Yuyy

    LeetCode:二叉树展开为链表_114
    思路 最终需要的结果是前序遍历,最简单的方式就是递归前序遍历,结果存到队列里,最后再组装。难一点的就是一边遍历一边组装结果,如果是递归,遍历左节点时,将父节点的右节点更改为左…
    扫描二维码继续阅读
    2021-09-03
    友情链接
    标签
    归档
    近期文章