title: 2019-8-15 二叉树镜像
tags: 算法,每日一题,二叉树
二叉树镜像
1. 题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
2. 题目解析
2.1 什么是二叉树镜像
说白了就是一棵二叉树在镜中所成的像就是二叉树的镜像,具体看图:
2.2 解题思路
递归的方式
递归的方法的本质是将一个大问题拆分为小问题,且这个小问题的解决方法是可以继续按照大方法差分为消防法的方式继续差分为更小的问题直到不能拆分为止(也就是达到了所谓的递归基)。
step1:交换根节点左右子树
step2:递归的交换当前节点的左右子树
具体的步骤图:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
//递归基,当前节点为空时返回
if(pRoot == NULL) return;
//step1:交换当前节点左右子树
TreeNode* temp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = temp;
//递归交换当前节点左右子树
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};
非递归的方式
非递归的方式其实是可以借鉴递归的经验。可以使用先序遍历的方式,每次到达对应节点之后立即交换左右子树。当然使用后续遍历也是可以的,只是把这个过程的顺序反了一下,由从根节点开始交换变成了从叶子节点开始交换。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot == NULL) return;
stack<TreeNode*> helpStack;
if (pRoot) helpStack.push(pRoot);
while(!helpStack.empty()){
//交换左右子树
pRoot = helpStack.top(); helpStack.pop();
TreeNode* temp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = temp;
//处理接下来的左右子树
if(pRoot->right) helpStack.push(pRoot->right);
if(pRoot->left) helpStack.push(pRoot->left);
}
}
};
更多关于编程和机器学习资料请关注FlyAI公众号。