题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
题解
题目抽象:给定一颗二叉树,将二叉树的左右孩子进行翻转,左右孩子的子树做相同的操作。
递归方法
根据题意,如果我们知道一个根节点的左孩子指针和右孩子指针,那么再改变根节点的指向即可解决问题。
也就是,需要先知道左右孩子指针,再处理根节点。显然对应遍历方式中的后序遍历。
class Solution {
public:
TreeNode* dfs(TreeNode *r){
if(!r)
return nullptr;
TreeNode *lval = dfs(r->left);
TreeNode *rval = dfs(r->right);
r->left = rval;
r->right = lval;
return r;
}
void Mirror(TreeNode *pRoot) {
if(!pRoot)
return;
dfs(pRoot);
}
};
时间复杂度:O(n),n为树节点的个数。每个节点只用遍历一次,所以为O(n)
空间复杂度:O(n), 每个节点都会在递归栈中存一次