题目描述:给定一颗二叉树,将其变成源二叉树的镜像。
例如:
思路:
本题解法有两种
1.递归算法
a)首先将根节点的左右子树进行交换;
b)通过递归,将左子树进行镜像变换;
c)通过递归,将右子树进行镜像变换。
代码如下:
<span style="font-size:14px;">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;
//将根节点的左右子树就行交换
TreeNode* mid=pRoot->right;
pRoot->right=pRoot->left;
pRoot->left=mid;
//通过递归对左子树就行交换
if(pRoot->left){
Mirror(pRoot->left);
}
//通过递归对右子树进行交换
if(pRoot->right){
Mirror(pRoot->right);
}
}
};</span>
2.非递归算法
a)使用一个栈stack,首先将根节点放进去,然后,根据栈中是否为空,将左右子树进行交换;
b)根据左子树节点是否为空,不为空,则存入栈中;
c)根据右子树节点是否为空,不为空,则存入栈中。
代码如下:
<span style="font-size:14px;">class Solution {
public:
void Mirror(TreeNode *pRoot) {
//终止条件
if(pRoot==NULL)
return;
//将根节点放入栈中
stack<TreeNode*>tem;
tem.push(pRoot);
//根据栈中是否为空,进行左右子树交换
while(!tem.empty()){
TreeNode* root=tem.top();
tem.pop();
//将左右子树交换
TreeNode* mid=root->left;
root->left=root->right;
root->right=mid;
if(root->left)
tem.push(root->left);
if(root->right)
tem.push(root->right);
}
}
};</span>