leetcode 114. 二叉树展开为链表

问题描述

给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树

    1
   / \
  2   5
 / \   \
3   4   6
将其展开为:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6

非递归

首先找到根节点,如果左子节点存在,则首先把右子节点与根节点断开,右子节点连接左子节点的所有节点,原左子节点最后的右子节点连接原右子节点的所有节点。例子中的过程如下:

     1
    / \
   2   5
  / \   \
 3   4   6

   1
    \
     2
    / \
   3   4
        \
         5
          \
           6
           
   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void flatten(TreeNode* root) {
        if(!root)return;
        TreeNode *cur = root,*tmp = NULL;
        while(cur)
        {
            if(cur->left)
            {
                tmp = cur->left;
                while(tmp->right)tmp = tmp->right;
                tmp->right = cur->right;
                cur->right = cur->left;
                cur->left = NULL;
            }
            cur = cur->right;
        }
    }
};

结果

执行用时:8 ms, 在所有 C++ 提交中击败了72.99%的用户
内存消耗:12 MB, 在所有 C++ 提交中击败了66.87%的用户

递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode *last = NULL;
    void flatten(TreeNode* root) {
        if(!root)return;
        if(root->right)flatten(root->right);
        if(root->left)flatten(root->left);
        root->right = last;
        root->left = NULL;
        last = root;
    }
};

结果

执行用时:8 ms, 在所有 C++ 提交中击败了72.99%的用户
内存消耗:12.2 MB, 在所有 C++ 提交中击败了31.58%的用户
posted @ 2020-08-02 15:14  曲径通霄  阅读(76)  评论(0编辑  收藏  举报