[Leetcode]Flatten Binary Tree to Linked List (三种方法)
来源:互联网 发布:vmware ubuntu 全屏 编辑:程序博客网 时间:2024/04/29 09:00
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
Hints:
今天因为论文的事情只做了这一道题,但是想得比较多,前两种方法自己想出来,最后一个借鉴了别人的方法,感觉最后一种实现起来最简洁。看leetcode的Run Time,三种方法在效率上倒是没有太大区别,都在70多ms。虽然递归实现比较好想,但是通常迭代实现效率会更高一些。
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
题意:
给一个二叉树,原址将它压成一个链表。根据例子来看是使用每个TreeNode的右孩子指针来实现这个链表。
仔细观察题目里给的例子,可以发现这其实就是一个先序遍历。最后要注意每个节点的左孩子指针最后都要置为NULL;
下面提供三种解题方法,思路或实现方法各有不同。
1、既然是先序遍历,而且是原址实现,实际就是不断地将每个节点的左右孩子交换位置。比如上边的例子:先将root节点的左右孩子(也就是2和5)交换位置,2节点来到了自己正确的位置,然后再将2节点的左右孩子交换位置,3节点没有孩子,然后将4节点放到3节点后边,然后是5节点,以此类推。
class Solution {public:TreeNode *p = NULL;void flatten(TreeNode *root) {if (NULL == root) return;TreeNode *left = root->left;TreeNode *right = root->right;exchange(root);}//这里最终的顺序和先序遍历一致,这里为了实现原址实现,只要某个节点左孩子不为空就将左右孩子交换位置//交换完成后再将左孩子(其实是右孩子交换过来的)接到后面void exchange(TreeNode *root){if (NULL != root){TreeNode *left = root->left;TreeNode *right = root->right;if (NULL == left && NULL == right){p = root;}else{if (left){root->left = right;root->right = left;exchange(root->right);p->right = root->left;root->left = NULL;exchange(p->right);}else{exchange(root->right);}}}}};
2、和第一种思路不同,如果某个节点的左孩子不为空,直接把这个节点的左子树插入到该节点和它的右子树之间。下面是递归实现:
class Solution{public: void flatten(TreeNode *root){ if(NULL == root) return; fla(root); } TreeNode *fla(TreeNode *root){//每次调用返回当前的最末节点,以便后边节点连接 <span style="white-space:pre"></span>TreeNode *left = root->left; TreeNode *right = root->right; root->left = NULL; if (NULL == left && NULL == right){ return root; } if(left){ root->right = left; TreeNode *last = fla(left); if(right){ last->right = right; } else{ return last; } } return fla(right); }};3、第二种思路的迭代实现(代码超级简洁):
class Solution{public: void flatten(TreeNode *root){ if(NULL == root) return; while(root){ if(root->left){ TreeNode *p = root->left; while(p->right) p = p->right; p->right = root->right; root->right = root->left; root->left = NULL; } root = root->right; } }};
今天因为论文的事情只做了这一道题,但是想得比较多,前两种方法自己想出来,最后一个借鉴了别人的方法,感觉最后一种实现起来最简洁。看leetcode的Run Time,三种方法在效率上倒是没有太大区别,都在70多ms。虽然递归实现比较好想,但是通常迭代实现效率会更高一些。
0 0
- [Leetcode]Flatten Binary Tree to Linked List (三种方法)
- LeetCode: Flatten Binary Tree to Linked List
- LeetCode Flatten Binary Tree to Linked List
- LeetCode: Flatten Binary Tree to Linked List
- [Leetcode] Flatten Binary Tree to Linked List
- [LeetCode] Flatten Binary Tree to Linked List
- Leetcode: Flatten Binary Tree to Linked List
- leetcode Flatten Binary Tree to Linked List
- LeetCode Flatten Binary Tree to Linked List
- LeetCode - Flatten Binary Tree to Linked List
- 【leetcode】Flatten Binary Tree to Linked List
- [LeetCode]Flatten Binary Tree to Linked List
- [Leetcode]Flatten Binary Tree to Linked List
- [leetcode]Flatten Binary Tree to Linked List
- LeetCode-Flatten Binary Tree to Linked List
- [leetcode] Flatten Binary Tree to Linked List
- LeetCode - Flatten Binary Tree to Linked List
- LeetCode:Flatten Binary Tree to Linked List
- 关于el表达式,ognl表达式,JSTL的区别
- 字符数组查找-----拉手笔试
- LeetCode 01 Two Sum
- 性能问题,如何定位一个应用响应慢等性能问题
- 黑马程序员——面向对象程序设计
- [Leetcode]Flatten Binary Tree to Linked List (三种方法)
- 如何实现servlet的线程安全
- 华为荣耀3C最新版ROM的root,(4.7.1和4.8.1等等通用方法)
- servlet是只有一个实例吗
- Permutation I,II
- opencv中遍历图像(IplImage格式)
- JAVA学习笔记——多线程
- 2014-10-30
- android内存检测