从lc114. 二叉树展开为链表到lc-LCR 155二叉搜索树转化为排序的双向链表

1 lc114. 二叉树展开为链表

1.1 描述

进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?
从lc114. 二叉树展开为链表到lc-LCR 155二叉搜索树转化为排序的双向链表_第1张图片

1.2 解法一:

先序遍历这棵树并且将节点加入到一个list中,随后按顺序将list中的每一个元素的left指针置换为空,right指针指向下一个节点

1.3 解法二:

按照先序遍历的倒叙方式遍历这棵二叉树,然后同时操作这个节点的左右指针。

class Solution {
    TreeNode pre;
    public void flatten(TreeNode root) {
        if(root==null){
            return;
        }
        flatten(root.right);
        flatten(root.left);
        root.right=pre;
        root.left=null;
        pre=root;
    }
}

1.3.1 为什么不能采用先序遍历,然后在过程中将左右指针进行相应的链接和置空呢?

答:因为先根遍历时进行正向的链接,会导致右子树断开,后续就无法遍历右子树中的节点

1.3.2 为什么先序的倒叙是代码中这样写的呢

答:先序遍历是"根-左-右",那么先序的倒叙应该是"右-左-根"

1.3.3 为什么先序的倒叙可以避免右子树的撕裂?

答:其实右子树无论如何都会被断开一次,但是因为右子树中的节点都已经被正确处理完后才开始重新接上,后续就不需要遍历右子树了。

1.3.4 如果让展开后的单链表应该同样使用 TreeNode ,其中 left 子指针指向链表中下一个结点,而right 子指针始终为 null ,解法是不是基本相同?

答:对,遍历结构还是先序的倒叙遍历

class Solution {
    TreeNode pre;
    public void flatten(TreeNode root) {
        if(root==null){
            return;
        }
        flatten(root.right);
        flatten(root.left);
        root.left=pre;
        root.right=null;
        pre=root;
    }
}

2 LCR 155二叉搜索树转化为排序的双向链表

多种方法解决leetcode经典题目-LCR 155. 将二叉搜索树转化为排序的双向链表, 同时弄透引用变更带来的bug

你可能感兴趣的:(数据结构,链表,数据结构)