• LeetCode //C - 114. Flatten Binary Tree to Linked List


    114. Flatten Binary Tree to Linked List

    Given the root of a binary tree, flatten the tree into a “linked list”:

    • The “linked list” should use the same TreeNode class where the right child pointer points to the next node in the list and the left child pointer is always null.
    • The “linked list” should be in the same order as a pre-order traversal of the binary tree.
       
    Example 1:

    在这里插入图片描述

    Input: root = [1,2,5,3,4,null,6]
    Output: [1,null,2,null,3,null,4,null,5,null,6]

    Example 2:

    Input: root = []
    Output: []

    Example 3:

    Input: root = [0]
    Output: [0]

    Constraints:
    • The number of nodes in the tree is in the range [0, 2000].
    • -100 <= Node.val <= 100

    From: LeetCode
    Link: 114. Flatten Binary Tree to Linked List


    Solution:

    Ideas:
    1. Modified Pre-Order Traversal: Traditional pre-order traversal visits a node in the order: root, left subtree, and then right subtree. The modification here is that we’re doing it in a slightly different order: we first flatten the right subtree, then the left subtree, and finally process the current root.

    2. Global prev Variable: This variable keeps track of the last node that we’ve visited. When we visit a new node, we’ll be linking this node to the prev node using the right pointer.

    3. Flattening Process:

    • When we visit a node:
      • We recursively flatten its right subtree.
      • We recursively flatten its left subtree.
      • We then update the current node’s right pointer to point to the prev node. This effectively appends the previously processed list to the current node.
      • We set the current node’s left pointer to NULL (because we want the linked list to use the right pointers).
      • Finally, we update the prev node to be the current node, as this node will be the previous node for the next node we process.
    1. Resetting the prev Variable: Before starting the flattening process for a tree (or a subtree), we reset the prev variable to NULL. This ensures that the last node in the flattened list will correctly point to NULL instead of some node from a previous test case or a previous run.

    2. Auxiliary Recursive Function: We’ve split the logic into two functions:

    • flatten_recursive handles the actual recursive flattening logic.
    • flatten is the main function that resets the prev variable and then calls the recursive function to perform the flattening.
    Code:
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    struct TreeNode* prev = NULL;
    
    void flatten_recursive(struct TreeNode* root) {
        if (!root) return;
    
        flatten_recursive(root->right);
        flatten_recursive(root->left);
    
        root->right = prev;
        root->left = NULL;
        prev = root;
    }
    
    void flatten(struct TreeNode* root) {
        prev = NULL;  // Reset the prev variable
        flatten_recursive(root);
    }
    
    • 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
  • 相关阅读:
    Cron 表达式详解及最新版本使用
    linux网络编程(udp)传输音频
    Google Earth Engine(GEE)——全球河流宽度数据集1970—2017年
    从页面 A 打开一个新页面 B,B 页面正常关闭或意外崩溃,A页面怎么更新B页面提交的参数并进行更新
    IntelliJ IDEA(Windows 版)的所有快捷键
    Unity Bolt模块间通信
    用TRIZ创新方法理论指导产品研发学习笔记
    SSM+医院移动收费运维平台 毕业设计-附源码161045
    Python: RANSAC随机一致性原理与实现
    ES聚合统计
  • 原文地址:https://blog.csdn.net/navicheung/article/details/132729626