【剑指offer】12.二叉树的镜像

总目录:

算法之旅导航目录

 

1.问题描述

操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数 0≤n≤1000 , 二叉树每个节点的值 0≤val≤1000
要求: 空间复杂度 O(n)。本题也有原地操作,即空间复杂度 O(1)的解法,时间复杂度 O(n)

 

2.问题分析

 1用递归,逐个交换节点的左右子节点即可

2用辅助队列,还是对每个节点交换左右子节点


3.代码实例

递归

 1 /**
 2  * struct TreeNode {
 3  *    int val;
 4  *    struct TreeNode *left;
 5  *    struct TreeNode *right;
 6  *    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     /**
12      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
13      *
14      * 
15      * @param pRoot TreeNode类 
16      * @return TreeNode类
17      */
18     TreeNode* Mirror(TreeNode* pRoot) {
19         //中止条件
20         if(!pRoot){
21             return NULL;
22         }
23 
24         //本层逻辑,交换当前节点的左右节点
25         TreeNode* tmp=pRoot->left;
26         pRoot->left=pRoot->right;
27         pRoot->right=tmp;
28 
29         //调用递归
30         Mirror(pRoot->left);
31         Mirror(pRoot->right);
32 
33         return pRoot;
34     }
35 };
View Code

队列

 1 /**
 2  * struct TreeNode {
 3  *  int val;
 4  *  struct TreeNode *left;
 5  *  struct TreeNode *right;
 6  *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 7  * };
 8  */
 9 class Solution {
10   public:
11     /**
12      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
13      *
14      *
15      * @param pRoot TreeNode类
16      * @return TreeNode类
17      */
18     TreeNode* Mirror(TreeNode* pRoot) {
19         //空树
20         if (!pRoot) {
21             return NULL;
22         }
23 
24         //初始化队列
25         queue<TreeNode*> q;
26         q.push(pRoot);
27 
28         //初始化当前层节点计数器
29         int nodeCount = 0;
30 
31         //逐层迭代
32         while (!q.empty()) {
33             //遍历当前层的所有节点
34             nodeCount = q.size();
35             for (int i = 0; i < nodeCount; i++) {
36                 auto* pNode = q.front();
37                 q.pop();
38 
39                 //本层逻辑,交换当前节点的左右节点
40                 TreeNode* tmp = pNode->left;
41                 pNode->left = pNode->right;
42                 pNode->right = tmp;
43 
44                 if (pNode->left) q.push(pNode->left);
45                 if (pNode->right) q.push(pNode->right);
46             }
47 
48             //本层结束
49         }
50         return pRoot;
51     }
52 };
View Code

 

posted @ 2022-11-11 14:22  啊原来是这样呀  阅读(17)  评论(0编辑  收藏  举报