• leetcode


    题目:Flatten Binary Tree to Linked List

    Given a binary tree, flatten it to a linked list in-place.

    For example,
    Given

             1
            / 
           2   5
          /    
         3   4   6
    

    The flattened tree should look like:

       1
        
         2
          
           3
            
             4
              
               5
                
                 6
    

    click to show hints.

    Hints:

    If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.

    个人思路:

    1、创建一个队列,把节点按照先序遍历的顺序入队

    2、把节点挨个出队,前一个出队节点是后一个出队节点的父节点,后一个出队节点是前一个出队节点的右孩子节点,且每个非叶节点的左孩子为空

    代码:

     1 #include <stddef.h>
     2 #include <iostream>
     3 #include <queue>
     4 
     5 using namespace std;
     6 
     7 struct TreeNode
     8 {
     9     int val;
    10     TreeNode *left;
    11     TreeNode *right;
    12     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    13 };
    14 
    15 class Solution
    16 {
    17 public:
    18     void flatten(TreeNode *root)
    19     {
    20         if (!root)
    21         {
    22             return;
    23         }
    24 
    25         queue<TreeNode *> preNodes;
    26         preorder(root, preNodes);
    27         root = preNodes.front();
    28         preNodes.pop();
    29         TreeNode * currentNode = root;
    30         while (!preNodes.empty())
    31         {
    32             TreeNode *tmp = preNodes.front();
    33             preNodes.pop();
    34             currentNode->right = tmp;
    35             currentNode->left = NULL;
    36             currentNode = currentNode->right;
    37         }
    38     }
    39 private:
    40     void preorder(TreeNode *root, queue<TreeNode *> &preNodes)
    41     {
    42         if (!root)
    43         {
    44             return;
    45         }
    46         preNodes.push(root);
    47         preorder(root->left, preNodes);
    48         preorder(root->right, preNodes);
    49     }
    50 };
    View Code

    在网上看到一个比较普遍的递归算法,链接:http://blog.unieagle.net/2012/12/16/leetcode-problemflatten-binary-tree-to-linked-list/,里面有比较详细的思路解析,可以参考,大致思路是这样:要扁平化一棵树,则扁平化根节点的左子树和右子树,然后将左子树放到根节点的右孩子位置,右子树放到左子树的叶节点的右孩子位置

    代码:

     1 #include <stddef.h>
     2 #include <iostream>
     3 #include <queue>
     4 
     5 using namespace std;
     6 
     7 struct TreeNode
     8 {
     9     int val;
    10     TreeNode *left;
    11     TreeNode *right;
    12     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    13 };
    14 
    15 class Solution
    16 {
    17 public:
    18     void flatten(TreeNode *root)
    19     {
    20         /*
    21         if (!root)
    22         {
    23             return;
    24         }
    25 
    26         queue<TreeNode *> preNodes;
    27         preorder(root, preNodes);
    28         root = preNodes.front();
    29         preNodes.pop();
    30         TreeNode * currentNode = root;
    31         while (!preNodes.empty())
    32         {
    33             TreeNode *tmp = preNodes.front();
    34             preNodes.pop();
    35             currentNode->right = tmp;
    36             currentNode->left = NULL;
    37             currentNode = currentNode->right;
    38         }
    39         */
    40 
    41         if (!root)
    42         {
    43             return;
    44         }
    45         if (root->left)
    46         {
    47             flatten(root->left);
    48         }
    49         if (root->right)
    50         {
    51             flatten(root->right);
    52         }
    53         if (!root->left)
    54         {
    55             return;
    56         }
    57 
    58         TreeNode *left_leaf = root->left;
    59         while (left_leaf->right)
    60         {
    61             left_leaf = left_leaf->right;
    62         }
    63         left_leaf->right = root->right;
    64         root->right = root->left;
    65         root->left = NULL;
    66     }
    67 private:
    68     void preorder(TreeNode *root, queue<TreeNode *> &preNodes)
    69     {
    70         if (!root)
    71         {
    72             return;
    73         }
    74         preNodes.push(root);
    75         preorder(root->left, preNodes);
    76         preorder(root->right, preNodes);
    77     }
    78 };
    View Code

    链接中还有一个非递归的思路,大家也可以看看

  • 相关阅读:
    阿里云 oss (二) 生成令牌
    doc转html
    js 实现下载本地文件
    vue 中使用video 使用视频/嵌入视频
    小程序裁剪
    车牌号正则
    小程序单选框 radio
    小程序省市三级联动 及日期选择 (年月日)
    小程序图片选择,小程序图片上传及调用后台接口上传
    element ui省市区三级联动,及获取三级联动的name值
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3799222.html
Copyright © 2020-2023  润新知