18、剑指offer--二叉树的镜像
题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5
解题思路:
1)若左右子结点不为空则交换左右子结点
2)对交换后的左子结点递归处理
3)对交换后的右子结点递归处理
1 #include <iostream> 2 #include <malloc.h> 3 using namespace std; 4 struct TreeNode { 5 int val; 6 struct TreeNode *left; 7 struct TreeNode *right; 8 TreeNode(int x) : 9 val(x), left(NULL), right(NULL) { 10 } 11 }; 12 class Solution { 13 public: 14 void Mirror(TreeNode *pRoot) { 15 if(pRoot == NULL) 16 return; 17 if(pRoot->left == NULL && pRoot->right == NULL) 18 return; 19 //交换左右子结点 20 TreeNode *temp = pRoot->left; 21 pRoot->left = pRoot->right; 22 pRoot->right = temp; 23 //交换后的左子节点不为空,递归 24 if(pRoot->left != NULL) 25 Mirror(pRoot->left); 26 //交换后的右子节点不为空,递归 27 if(pRoot->right != NULL) 28 Mirror(pRoot->right); 29 } 30 }; 31 //先序建立二叉树 32 TreeNode *CreateBiTree(){ 33 int ch; 34 35 TreeNode *T; 36 cin>>ch; 37 if(ch== 0)T=NULL; 38 else{ 39 T = (TreeNode *)malloc(sizeof(TreeNode)); 40 T->val = ch; 41 cout<<"输入左子节点"<<endl; 42 T->left = CreateBiTree(); 43 cout<<"输入右子节点"<<endl; 44 T->right = CreateBiTree(); 45 } 46 return T;//返回根节点 47 } 48 //先序遍历二叉树 49 void PreOrderTraverse(TreeNode *T){ 50 if(T) 51 { 52 cout<<T->val<<" "; 53 PreOrderTraverse(T->left); 54 PreOrderTraverse(T->right); 55 } 56 } 57 int main() 58 { 59 TreeNode *T1; 60 cout<<"输入根节点:"<<endl; 61 T1 = CreateBiTree();//建立 62 cout<<"原二叉树先序遍历"<<endl; 63 PreOrderTraverse(T1);//输出 64 cout<<endl; 65 Solution s; 66 s.Mirror(T1); 67 cout<<"镜像后的二叉树先序遍历"<<endl; 68 PreOrderTraverse(T1);//输出 69 return 0; 70 }