Leetcode 114 - 二叉树展开为链表

这道题是要把一个二叉树,展开为一个单链表, 它的要求有2点

1. 展开后的单链表也同样适用TreeNode, 这个单链表左子指针始终为null, 右子指针指向链表中的下一个结点

2. 展开后的单链表应该与二叉树的先序遍历(先根遍历,也就是 根节点->左节点->右节点)顺序相同

 

 拿到这个题目后,我们来看看,应该怎么入手,我们以上面这颗比较简单的二叉树为例来看看。

根节点1 -> 它的左子树,按照先序遍历,遍历完成后,应该是 2->3->4

根节点1 -> 它的右子树,按照先序遍历,遍历完成后,应该是5->6

再对比最后需要的结果,我们就能发现规律

1. 把根节点的左子树先序遍历完成后,作为一个新的节点(2->3->4), 挂在原来的根节点root(根节点1)的右边,作为她的右子节点

 2. 把根节点的右子树先序遍历完成后,作为一个新的节点(5->6),挂在第1步产生的新的节点的右边,作为它的右子节点

image

 整个过程完成

代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public void flatten(TreeNode root) {
        
        if(root == null) 
           return;
   
        var left = root.left;
        var right = root.right;

        flatten(root.left);
        flatten(root.right);

       root.left = null;
       root.right = left;

        var p = root;
        while (p.right != null) {
            p = p.right;
        }
        p.right = right;


    }
}

 

posted on 2025-07-23 16:48  新西兰程序员  阅读(9)  评论(0)    收藏  举报