(1)着重看左右子节点交换位置的指针交换指向那块,也就是父节点的左指针去指原来的右子树,左指针指原来的做孩子
/*
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;
if(pRoot->left==nullptr&&pRoot->right==nullptr)
return;
else
{
//pRoot->left和pRoot->right两指针交换内存中的指向
TreeNode* temp=pRoot->left;
pRoot->left=pRoot->right;
pRoot->right=temp;
}
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};
(2)本题扩展:非递归实现一和非递归实现先序遍历相同
if (pRoot ==nullptr)
return;
stack<TreeNode*> s;//创建一个栈
s.push(pRoot);
TreeNode *pointer = nullptr;
while (!s.empty())
{
pointer = s.top();//取出栈顶元素
s.pop();
if (pointer->left != nullptr || pointer->right != nullptr)//非叶子节点
{
swap(pointer->left,pointer->right);//交换其左右孩子
}
if (pointer->left != nullptr)//非空左子树入栈
s.push(pointer->left);
if (pointer->right != nullptr)//非空右子树入栈
s.push(pointer->right);
}
}
};
非递归实现二
非递归的思想:我们按照广度遍历二叉树的顺序,逐个处理遍历的节点。当处理的当前节点,如果有孩子节点,我们交换它们的孩子节点,并且把它们的非空孩子入队列。处理完当前节点以后,我们下一次处理队头的节点。
void mirror01(BinaryTreeNode *&root)
{
queue<BinaryTreeNode *> q;
BinaryTreeNode *pointer = root;//当前处理的节点为根节点
while (pointer)
{
swap(pointer->left, pointer->right);//交换当前处理节点的孩子
if (pointer->left)//左孩子不为空
q.push(pointer->left);
if (pointer->right)//右孩子不为空
q.push(pointer->right);
if (!q.empty())
{
pointer = q.front();
q.pop();
}
else
{
break;
}
}
参考:https://blog.csdn.net/yang20141109/article/details/50857648