题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
解题思路:
先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子节点,
当交换完所有的非叶子结点的左右子结点之后,就得到了树的镜像
纯前序遍历的递归代码
class Solution {
public:
void Mirror(TreeNode* pRoot) {
if(pRoot) {
swap(pRoot -> left, pRoot -> right);
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;
}
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(NULL == pRoot)
return;
stack<TreeNode*> stackTreeNode;
stackTreeNode.push(pRoot);
while(stackTreeNode.size())
{
TreeNode* pRoot = stackTreeNode.top();
stackTreeNode.pop();
if (NULL != pRoot->left || NULL != pRoot->right)
{
TreeNode* pTemp = pRoot -> left;
pRoot -> left = pRoot -> right;
pRoot -> right = pTemp;
}
if (NULL != pRoot -> left)
stackTreeNode.push(pRoot -> left);
if (NULL != pRoot -> right)
stackTreeNode.push(pRoot -> right);
}
return;
}
};