• 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 };

  • 相关阅读:
    SwiftUI_2_共享绑定
    iOS_知识点_动画&绘图
    excle表格数据列前批量添加数据
    异步编程模式学习
    这不是一篇技术文档!
    lowcode
    java中如何针对系统灵活变换分割符?
    linux安装nginx
    序列化与反序列化
    Linux安装nginx star
  • 原文地址:https://www.cnblogs.com/gremount/p/6671222.html
Copyright © 2020-2023  润新知