思路是:拉直的顺序相当于先序遍历,所以先访问根,再访问左子树,再访问右子树。
需要做的是找到(i) .叶子节点 (ii).把右孩子 放到 左孩子的右孩子上,注意左孩子的两个子树必为空 (iii)然后把根的右孩子放到刚才节点的后面 (vi)把 根的左孩子放到右孩子的位置,左孩子置为空。
class Solution {
public:
void flatten(TreeNode *root) {
if(root == NULL)
return;
if(root->left == NULL && root->right == NULL)
return;
if(root->left){
flatten(root->left);
flatten(root->right);
TreeNode *p = root->left;
while(p->right)
p = p->right;
p->right = root->right;
root->right = root->left;
root->left = NULL;
}
else
flatten(root->right);
return ;
}
};