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) {
if(root == NULL || (root->left == NULL && root->right == NULL))
return;
if(root->left)
flatten(root->left);
if(root->right)
flatten(root->right);
if(root->left && root->left->left == NULL)
{
TreeNode* cur = root->left;
while(cur->right != NULL)
cur = cur->right;
cur->right = root->right;
root->right = root->left;
root->left = NULL;
}
}
};