zoukankan      html  css  js  c++  java
  • LeetCode 114. Flatten Binary Tree to Linked List

    题意是把一个二叉树转换成一个链表,链表的元素顺序是二叉树的先序遍历结果。

    最简单的做法就是先序遍历该二叉树,将所有经过的节点的指针都依次记录在一个vector里,完成后,在将vector里的节点指针的左孩子置为NULL,右孩子置为vector中的下一个指针。具体的代码和运行效果如下

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     void preOrderTravel(TreeNode* root,vector<TreeNode*>& nodes){
    13         nodes.push_back(root);
    14         if(root->left!=NULL)
    15             preOrderTravel(root->left,nodes);
    16         if(root->right!=NULL)
    17             preOrderTravel(root->right,nodes);
    18     }
    19     void flatten(TreeNode* root) {
    20         if(root==NULL)return;
    21         vector<TreeNode*> nodes;
    22         preOrderTravel(root,nodes);
    23         int i=0;
    24         for(i=0;i<nodes.size()-1;i++){
    25             nodes[i]->left=NULL;
    26             nodes[i]->right=nodes[i+1];
    27         }
    28         nodes[i]->left=NULL;
    29         nodes[i]->right=NULL;
    30     }
    31 };

    这里用了多余的空间来存储二叉树的节点,是否可以不用多余的空间来实现转换呢?这里就想到了递归思想,既然flatten操作可以完成转换,可不可以先转换根节点的左子树,再转换根节点的右子树,最后再合成完整的二叉树。用例子来推演就可以得到如下的代码,这份代码的空间复杂度是O(1),时间复杂度理论是和上面的代码相同(都是遍历一遍树),但实际从LeetCode运行结果来看,上面的代码更快。具体的代码和运行效果如下:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode* prev=NULL;
    13     void flatten(TreeNode* root) 
    14     {
    15         if(root==NULL)return;
    16         flatten(root->right);
    17         flatten(root->left);
    18         root->left=NULL;
    19         root->right=prev;
    20         prev=root;
    21     }
    22 };

  • 相关阅读:
    [POJ1151]Atlantis
    [POJ1177]Picture
    [POJ1765]November Rain
    Adaptively handling remote atomic execution based upon contention prediction
    Webpack 2.0 的文档
    PAT乙级 1025. 反转链表 (25)
    PAT乙级 1024. 科学计数法 (20)(未通过全部测试,得分18)
    PAT乙级 1023. 组个最小数 (20)
    PAT乙级 1022. D进制的A+B (20)
    PAT乙级 1021. 个位数统计 (15)
  • 原文地址:https://www.cnblogs.com/gremount/p/6671222.html
Copyright © 2011-2022 走看看