题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
思路
进行先序遍历到某个节点,首先判断这个节点是不是叶子结点,如果不是,就将这个节点的左右孩子节点进行交换,当所有的非叶子结点交换完毕后就得到镜像二叉树了
程序运行过程(如图)
AC代码
#include <iostream>
using namespace std;
typedef struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL)
{
}
} TreeNode;
//先序创建
TreeNode *Create_tree()
{
TreeNode *T;
int val;
cin >> val;
if (val == 0) //叶子结点用0标记
return NULL;
else
{
T = new TreeNode(val);
T->left = Create_tree();
T->right = Create_tree();
}
return T;
}
//先序遍历
void pre_print(TreeNode *T)
{
if (T)
{
cout << T->val << " ";
pre_print(T->left);
pre_print(T->right);
}
}
class Solution
{
public:
void Mirror(TreeNode *pRoot)
{
if (pRoot == NULL || (pRoot->left == NULL && pRoot->right == NULL)) //叶子结点就不用交换
return;
TreeNode *temp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = temp;
if (pRoot->left)
Mirror(pRoot->left);
if (pRoot->right)
Mirror(pRoot->right);
}
};
int main()
{
TreeNode *root;
root = Create_tree();
cout << "先序遍历为:";
pre_print(root);
cout << endl;
cout << "镜像交换后为:";
Solution so;
so.Mirror(root);
pre_print(root);
return 0;
}
/*测试样例
8 6 5 0 0 7 0 0 10 9 0 0 11 0 0
先序遍历为:8 6 5 7 10 9 11
镜像交换后为:8 10 11 9 6 7 5
*/