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

原文地址:https://www.cnblogs.com/gremount/p/6671222.html