题目地址:
https://leetcode.com/problems/binary-tree-upside-down/
给定一棵二叉树,要求对其从树根出发的左链做如下图的操作。返回新二叉树。
思路是DFS,在DFS的时候返回当前子树翻转之后的新树树根。如果树空则返回null;如果当前节点没有左孩子,则当前节点就是新树树根,返回之。否则先递归处理左子树,则得到新树树根。然后处理当前节点,其左孩子的左孩子是其右孩子,然后其左孩子的右孩子就是自己。最后把当前节点的左右孩子设为空,然后递归返回上层。代码如下:
class Solution {
public:
TreeNode* upsideDownBinaryTree(TreeNode* root) {
return dfs(root);
}
TreeNode* dfs(TreeNode* p) {
if (!p) return nullptr;
if (!p->left) return p;
TreeNode* res = dfs(p->left);
p->left->left = p->right;
p->left->right = p;
p->left = p->right = nullptr;
return res;
}
};
时空复杂度 O ( h ) O(h) O(h)。