题目描述:
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
其实分析题意就是把二叉树按照前序遍历的顺序形成链表,链表的结构是每个节点的下一个节点都是它的右节点,每个节点的左节点都为空。这道题可以直接前序遍历二叉树,同时用数组记录,然后重新构造一个二叉树,但是这样需要额外的空间。
此题可以用递归的方法解决,即先运用递归,将根节点的左子树、右子树化为链表,同时让根节点的右节点为左子树链表的起点,然后令右子树链表连接至左子树链表的末尾。
class Solution {
public:
void flatten(TreeNode* root) {
root=DFS(root);
}
TreeNode* DFS(TreeNode* root)
{
if(root==NULL) return NULL;
TreeNode* temp=root->right;
root->right=DFS(root->left);
root->left=NULL;
TreeNode* p=root;
while(p->right!=NULL) p=p->right;
p->right=DFS(temp);
return root;
}
};
另外,还可以用非递归的方法修改指针,思想方法和递归一致。
class Solution {
public:
void flatten(TreeNode* root) {
TreeNode* p=root;
if(p==NULL) return;
while(p!=NULL)
{
if(p->left!=NULL)
{
TreeNode* temp=p->right;
p->right=p->left;
p->left=NULL;
TreeNode* q=p;
while(q->right!=NULL) q=q->right;
q->right=temp;
}
p=p->right;
}
}
};