【剑指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 };
队列
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 };