题目描述
完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点定义如下:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
二叉树镜像的定义:
思路分析
以上面这棵树为例,我们先分析以8为根节点以及左右子树是6和10的这棵子树,我们可以看到,对于当前的根节点8,其镜像是将左右子树的位置进行了调换,因此就可以得出下图中的a图,此时以当前结点为根节点的子树其镜像已经做完,我们继续往下遍历,当当前根节点为10时,其镜像也是将左右子树调换,因此可以得到图中的b图;同样,交换6结点的左右子树就可以得到最终的图c。
综上,我们就可以得出求一棵二叉树镜像的过程:我们可以采用前序遍历的方法,一遍遍历一边交换,如果当前根节点没有左右结点就不交换,否则就交换左右结点。这里交换左右结点的方法是只要改变根节点的left和right指针即可。
代码如下:
void Mirror(TreeNode *pRoot) {
if(pRoot == NULL || (pRoot->left==NULL && pRoot->right==NULL))
return ;
TreeNode* tmp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = tmp;
if(pRoot->left)
Mirror(pRoot->left);
if(pRoot->right)
Mirror(pRoot->right);
}