114. Flatten Binary Tree to Linked List**
https://leetcode.com/problems/flatten-binary-tree-to-linked-list/
题目描述
Given a binary tree, flatten it to a linked list in-place.
For example, given the following tree:
1
/ \
2 5
/ \ \
3 4 6
The flattened tree should look like:
1
\
2
\
3
\
4
\
5
\
6
C++ 实现 1
将二叉树展开成链表
这道题使用递归做很方便, 定义 prev 用于记录当前访问节点的前一个节点.
class Solution {
private:
// prev 用于记录已经被 flatten 的子树的根节点
TreeNode *prev = nullptr;
public:
void flatten(TreeNode* root) {
if (!root)
return;
flatten(root->right);
flatten(root->left);
root->right = prev;
root->left = nullptr;
prev = root;
}
};
上面代码中最后的 prev = root
就是用于记录当前访问节点的前一个节点, 不过这是在有前面两行代码的前提下. 如果前两行代码没有, 那么代码本身就相当于做一个二叉树的后序遍历. 当有前两行代码, 假设 root->right
已经被 flatten 了, 那么此时 prev
就是指向右子树的根节点, 之后要对左子树进行访问, 由于是后序遍历, 那么访问的第一个节点就是左子树中最右边的节点:
0
/ \
1 2
/ \
3 4
如上面的例子, prev
此时指向 2, 而当前访问的节点是 4, 即 root 此时为 4, 那么:
root->right = prev;
root->left = nullptr;
prev = root;
这段代码的意义就是让 4 指向 2, 同时令 prev
指向 4.