题目:Given a binary tree, flatten it to a linked list in-place.
For example, Given
1
/ \
2 5
/ \ \
3 4 6
The flattened tree should look like:
1
\
2
\
3
\
4
\
5
\
6
该题目解法代码有递归和迭代两种版本
下面解法代码的思想及编写参考了网址https://github.com/soulmachine/leetcode#leetcode题解题目
递归代码如下:
// 递归版本,时间复杂度 O(n),空间复杂度 O(log n)
class Solution {
public:
void flatten(TreeNode* root) {
if (!root) return; // 终止条件
flatten(root -> left);
flatten(root -> right);
if (root -> left == nullptr) return;
// 三方合并,将左子树所形成的链表插入到 root 和 root -> right 之间
TreeNode* p = root -> left;
while (p -> right) p = p -> right; // 寻找左链表最后一个节点
p -> right = root -> right;
root -> right = root -> left;
root -> left = nullptr;
}
};
我们发现展直后的树每一节点的右节点是其原先树前序遍历后的下一节点,按照这一思想,我们有了下面迭代代码
// 迭代版本,时间复杂度 O(n),空间复杂度 O(log n)
class Solution {
public:
void flatten(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* cur = nullptr;
if (root) s.push(root);
while (!s.empty()) {
cur = s.top(), s.pop();
if (cur -> right) s.push(cur -> right);
if (cur -> left) s.push(cur -> left);
cur -> left = nullptr;
if (!s.empty())
cur -> right = s.top();
}
}
};