LeetCode-二叉树展开为链表

1,381 阅读1分钟

算法记录

LeetCode 题目:

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


说明

一、题目

  展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。

  展开后的单链表应该与二叉树先序遍历顺序相同。

二、分析

  • 按照题意要求展开的单链表需要和二叉树的前序遍历结果一致,而且是在原地进行操作的。
  • 也就是我们在进行遍历过程中需要手动的更改节点的相对位置,同时更新最终结果链的指向。
  • 一旦我们处理到了一个节点,按照前序遍历的方式我们下一个要处理的必定是当前点的左子节点,而当前节点的右子节点只能在左子节点中的所有右节点都处理完毕之后才会处理,那么就只需要拿到左子节点的最右边节点,然后指向右子节点,这样就能在遍历过程中通过右节点拿到下一个节点数。
  • 上面说得可能有点儿隐晦,结合下面的算法来看可能比较清晰。
class Solution {
    public void flatten(TreeNode root) {
        TreeNode cur = root;
        while(cur != null) {
            if(cur.left != null) {
                // 修改当前的右子节点的位置
                TreeNode next = cur.left, forward = next;
                while(forward.right != null) forward = forward.right;
                forward.right = cur.right;
                cur.left = null;
                cur.right = next;
            }
            // 按照链表遍历的方式进行节点的遍历
            cur = cur.right;
        }
    }
}

总结

二叉搜索树的性质。