题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述
题解
以下为 2019.06.07 更新
/*
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);
};
void Solution::Mirror(TreeNode* pRoot)
{
if (!pRoot)
{
return;
}
std::swap(pRoot->left, pRoot->right);
Mirror(pRoot->left);
Mirror(pRoot->right);
}
以上为 2019.06.07 更新
方法一:递归
所谓镜像就是把左右子树交换嘛
拿到一棵树的根节点,如果非空,就交换左右孩子节点
然后递归交换左子树,再递归交换右子树
下面附上代码:
/*
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 == nullptr)
{
return ;
}
TreeNode * tmp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = tmp;
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;
std::stack<TreeNode*> stackNode;
stackNode.push(pRoot);
while(!stackNode.empty())
{
TreeNode* tree = stackNode.top();
stackNode.pop();
if(tree->left != NULL || tree->right != NULL)
{
TreeNode *ptemp = tree->left;
tree->left = tree->right;
tree->right = ptemp;
}
if(tree->left)
stackNode.push(tree->left);
if(tree->right)
stackNode.push(tree->right);
}
}
};
两种方法都通过了 newcode 所有测试用例
有问题或者更好的方法欢迎留言,一起学习,一起进步 ?