From 0ad5b9e56a84b4371481f4dfb23f0d90d931fc80 Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Tue, 11 Jun 2019 19:56:58 +0800 Subject: [PATCH] update 114 and add 114 to readme --- README.md | 1 + ...114. Flatten Binary Tree to Linked List.md | 61 ++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 213306c..186d10a 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,7 @@ LeetCode solutions with Chinese explanation. LeetCode中文题解。 | 111 |[Minimum Depth of Binary Tree](https://leetcode.com/problems/minimum-depth-of-binary-tree)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/111.%20Minimum%20Depth%20of%20Binary%20Tree.md)|Easy| | | 112 |[Path Sum](https://leetcode.com/problems/path-sum)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/112.%20Path%20Sum.md)|Easy| | | 113 |[Path Sum II](https://leetcode.com/problems/path-sum-ii/)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/113.%20Path%20Sum%20II.md)|Medium| | +| 114 |[Flatten Binary Tree to Linked List](https://leetcode.com/problems/flatten-binary-tree-to-linked-list/)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/114.%20Flatten%20Binary%20Tree%20to%20Linked%20List.md)|Medium| | | 118 |[Pascal's Triangle](https://leetcode.com/problems/pascals-triangle)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/118.%20Pascal's%20Triangle.md)|Easy| | | 119 |[Pascal's Triangle II](https://leetcode.com/problems/pascals-triangle-ii)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/119.%20Pascal's%20Triangle%20II.md)|Easy| | | 121 |[Best Time to Buy and Sell Stock](https://leetcode.com/problems/best-time-to-buy-and-sell-stock)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/121.%20Best%20Time%20to%20Buy%20and%20Sell%20Stock.md)|Easy| | diff --git a/solutions/114. Flatten Binary Tree to Linked List.md b/solutions/114. Flatten Binary Tree to Linked List.md index fbf74ce..88e9275 100644 --- a/solutions/114. Flatten Binary Tree to Linked List.md +++ b/solutions/114. Flatten Binary Tree to Linked List.md @@ -5,7 +5,7 @@ ## 思路一 最容易想到的就是先序遍历一遍树。我们可以用一个全局的指针`list_last`记录当前链表的最后一个节点,每遍历到一个节点就将其接到`list_last`后面(右指针)。 -## 思路二 +## 思路二* 此题也可以直接递归来做。即如果root的左右子树都已经是被展开好的,那么只需要将左子树接在root的右边,再将右子树接在原来左子树的最下边就可以了,如下例。 ``` 1 1 @@ -21,6 +21,42 @@ 6 ``` +## 思路三* +可以将思路二改成非递归版本。原理类似:当前工作指针p指向root,如果p有左子树,那么将其左子树接在p的右边,而原来的右子树接在左子树的最右下边节点,此为一次循环,然后工作指针p向右下移动一步,重复上述操作。下面举个例子: +``` +原二叉树: + 1 + / \ + 2 5 + / \ \ +3 4 6 + +第一次工作指针p指向1,循环后: + 1 + \ + 2 + / \ + 3 4 + \ + 5 + \ + 6 + +第二次工作指针p指向2,循环后: + 1 + \ + 2 + \ + 3 + \ + 4 + \ + 5 + \ + 6 +接下来每次循环p依次指向3、4、5、6,由于p没有左子树,所以不作任何操作。 +``` + # C++ ## 思路一 ``` C++ @@ -73,4 +109,27 @@ public: tmp -> right = right; } }; +``` + +## 思路三 +``` C++ +class Solution { +public: + void flatten(TreeNode* root) { + TreeNode *p = root; + while(p){ + if(p -> left){ + // 先备份右子树 + TreeNode *right_bk = p -> right; + p -> right = p -> left; + p -> left = NULL; + TreeNode *tmp = p; + while(tmp -> right) tmp = tmp -> right; + // 此时tmp指向p原来左子树的最右下节点 + tmp -> right = right_bk; + } + p = p -> right; + } + } +}; ``` \ No newline at end of file