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 }

posted @ 2017-05-18 10:27  qqky  阅读(170)  评论(0编辑  收藏  举报