剑指 Offer 27. 二叉树的镜像
二叉树镜像定义: 对于二叉树中任意节点 root,设其左 / 右子节点分别为 left, right ;则在二叉树的镜像中的对应 root 节点,其左 / 右子节点分别为 right, left 。
第一种解法:采用递归的方式
根据二叉树镜像的定义,递归遍历dfs二叉树,交换每个节点的左右子树,即可生成二叉树的镜像。
递归解析:
- 终止条件: 当节点 rootroot 为空时(即越过叶节点),则返回 nullnull ;
- 递推工作:
1>.初始化节点 tmptmp ,用于暂存 rootroot 的左子节点;
2>.开启递归 右子节点 mirrorTree(root.right)mirrorTree(root.right) ,并将返回值作为 rootroot 的 左子节点 。
3>.开启递归 左子节点 mirrorTree(tmp)mirrorTree(tmp) ,并将返回值作为 rootroot 的 右子节点 。 - 返回值: 返回当前节点 rootroot ;
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
//递归
if(root == NULL)
return NULL;
//记录root的左
TreeNode *tmp = root->left;
//镜像将根的左右子树对调
root->left = mirrorTree(root->right);
root->right = mirrorTree(tmp);
return root;
}
};
第二种解法:辅助栈(队列)
利用栈和队列遍历树的每个node节点,然后将每个node的左右节点交换。
算法流程:
- 特例处理: 当 rootroot 为空时,直接返回 null ;
- 初始化: 栈(或队列),本文用栈,并加入根节点 root 。
- 循环交换: 当栈 stack为空时跳出;
- 出栈: 记为 node;
- 添加子节点: 将 node左和右子节点入栈;
- 交换: 交换 node的左 / 右子节点。
- 返回值: 返回根节点 root。
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
//使用栈
if(root == NULL)
return NULL;
stack<TreeNode*> stack;
stack.push(root);
while(!stack.empty())
{
//首元素出栈
TreeNode* node = stack.top();
stack.pop();
//将左右子树入栈对调
if(node->left != NULL)
stack.push(node->left);
if(node->right != NULL)
stack.push(node->right)
reeNode *tmp = node->left;
node->left = node->right;
node->right = tmp;
}
return root;
}
};