题意:给一棵树,按前序遍历的顺序将依次放在右子树上
思路:
1,第一眼看上去的思路是,前序遍历tree,节点依次加入队列,遍历完之后,出队,并连接成题目要求
时间复杂度O(N) 空间复杂度O(N)
2.想了想,一定有空间复杂度O(logN)的
对于一棵树,我要把它变成题中的链表状。需要1把左子树变成如题的链表状;2.把右子树变成链表状;3.根->链状左子树,链状左子树的最后一个节点->链状右子树
按前序遍历递归,得到结果
/**
* 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) {
TreeNode *p;
if(root == NULL)
return ;
//fa记录最后一个节点
fa = root;
//题目中是前序遍历,所以左节点先被遍历,所以应该放在右侧
p = root->left;
root->left = root->right;
root->right = p;
flatten(root->right);
fa -> right = root->left;//链状左子树的最后一个节点链接到原右子树的根
flatten(root->left);
root->left = NULL;
return ;
}
TreeNode *fa;
};