• 【LeetCode热题100】--114.二叉树展开为链表


    114.二叉树展开为链表

    image-20231004191111290

    方法一:对二叉树进行先序遍历,得到各个节点被访问到的顺序,利用数组存储下来,然后在先序遍历之后更新每个节点的左右节点的信息,将二叉树展开为链表

    /**
     * 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) {
            List<TreeNode> list = new ArrayList<TreeNode>();
            preorderTraversal(root,list);
            int size = list.size();
            for(int i =  1;i<size;i++){
                TreeNode prev = list.get(i - 1),curr = list.get(i);
                prev.left = null;
                prev.right = curr;
            }
        }
        public void preorderTraversal(TreeNode root, List<TreeNode> list) {
            if (root != null) {
                list.add(root);
                preorderTraversal(root.left, list);
                preorderTraversal(root.right, list);
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    方法二:

    /**
     * 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;
            }
            // 1. 先将左子树展开为链表
            flatten(root.left);
            // 2. 将右子树展开为链表
            flatten(root.right);
            // 将左子树迁移到右子树中
            TreeNode node = root.left;
            if (node != null) {     
                // 如果左子树不为空
                // 3.1. 先找到左子树链表中的最右端的结点
                while (node.right != null) {
                    node = node.right;
                }
                // 3.2. 将右子树插入到左子树的尾部结点
                node.right = root.right;
                // 3.3 将左子树换到右结点
                root.right = root.left;
                root.left = null;
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    阿里巴巴2022届秋招面试真题和答案!
    1030:计算球的体积
    C++ pointer from beginner to advanced
    一场江湖恩怨从「聚合数据」说起——第五篇
    前端经典面试题 | 性能优化之 懒加载
    DGIOT实战教程-监控摄像头接入(v4.6.0)
    【前端精进之路】JS篇:第5期 JS引擎线程的执行过程的三个阶段
    Android maven could not get http://192.xx
    Spring MVC拦截器
    Python数据分析与机器学习30-SVM实例
  • 原文地址:https://blog.csdn.net/qq_46656857/article/details/133560139