Flatten Binary Tree to Linked List
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
Hints:
If you notice carefully in the flattened tree, each node’s right child points to the next node of a pre-order traversal.
解题思路
思路一:变换后的树实际上是按照先序遍历的顺序排列的,因此我们可以在先序遍历的过程中记录先序遍历的前驱结点,调整前驱结点的左右子树。这里需要注意的是遍历过程中需要先将当前节点的右子树记录下来,再递归调整当前节点的左右子树。代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
void preorderFlatten(TreeNode *root, TreeNode *&pre) {
if (root == NULL) return;
// pre 保存前序遍历序列中的前一个节点
if (pre) {
pre->left = NULL;
pre->right = root;
}
pre = root;
TreeNode *right = root->right; // Note:先把右子树保存下来
preorderFlatten(root->left, pre); //递归
preorderFlatten(right, pre); // 递归
}
public:
void flatten(TreeNode* root) {
TreeNode *pre = NULL;
return preorderFlatten(root, pre);
}
};
思路二:从根节点开始,如果当前节点有左子树,就将它的左子树添加到自己和右子树之间:既将当前节点的右子树作为左子树最右边的节点的右子树。然后依次往右处理当前结点的右子树,直到右子树为空。代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
if (root == NULL) return;
while(root != NULL) {
if (root->left != NULL) {
TreeNode *pre = root->left; // pre 指向左子树最右边的节点
while (pre->right != NULL) pre = pre->right;
pre->right = root->right;
root->right = root->left;
root->left = NULL;
}
root = root->right;
}
}
};