114. 二叉树展开为链表-前序遍历

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了114. 二叉树展开为链表-前序遍历相关的知识,希望对你有一定的参考价值。

一、题目描述

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

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

输入: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]

二、解题

前序遍历

前序遍历二叉树,然后将每个节点保存在链表中,然后在根据链表重新构造树

/**
 * 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 
    List<TreeNode> queue = new ArrayList<>();
    public void flatten(TreeNode root) 
        //将先序遍历链表,然后将其存放在链表中,然后重新构造
        if(root == null)
            return ;
        
        preorder(root);
        int length = queue.size();
        TreeNode cur = queue.get(0);
        for(int i = 1;i<length;i++)
            cur.left = null;
            cur.right = queue.get(i);
            cur = cur.right;
        
    
    public void preorder(TreeNode root)
        if(root == null)
            return ;
        
        queue.add(root);
        preorder(root.left);
        preorder(root.right);
    

时间复杂度:O(n);

空间复杂度:O(n)。

寻找前驱节点

对于当前节点,如果其左子节点不为空,则在其左子树中找到最右边的节点,作为前驱节点,将当前节点的右子节点赋给前驱节点的右子节点,然后将当前节点的左子节点赋给当前节点的右子节点,并将当前节点的左子节点设为空。对当前节点处理结束后,继续处理链表中的下一个节点,直到所有节点都处理结束。

class Solution 
    public void flatten(TreeNode root) 
        TreeNode curr = root;
        while (curr != null) 
            if (curr.left != null) 
                TreeNode next = curr.left;
                TreeNode predecessor = next;
                while (predecessor.right != null) 
                    predecessor = predecessor.right;
                
                predecessor.right = curr.right;
                curr.left = null;
                curr.right = next;
            
            curr = curr.right;
        
    

以上是关于114. 二叉树展开为链表-前序遍历的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode114 二叉树展开为链表 ---二叉树题 三种解法 (递归) (迭代) (前驱节点)

[LeetCode] 114. 二叉树展开为链表

[LeetCode] 114. 二叉树展开为链表 ☆☆☆(深度遍历)

二叉树展开为链表

二叉树展开为链表

LeetCode(114): 二叉树展开为链表