题意思路:
操作给定的二叉树,将其变换为源二叉树的镜像。
也就是将二叉树的每个节点的左子树换成右子树,右子树换成左子树
方法一:递归处理
先处理当前root的左右节点,使当前节点的左子树与右子树交换,达到镜像目的,
然后再递归处理左子树和右子树即可。
特例当pRoot为空时,直接返回pRoot。
复杂度分析
时间复杂度:O(N),N为树的节点数目,遍历数组;
空间复杂度:O(N),数组存储与读取数据。
图解:
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pRoot TreeNode类 * @return TreeNode类 */ TreeNode* Mirror(TreeNode* pRoot) { // write code here if(pRoot==NULL)return pRoot;//特判若节点为空则返回 TreeNode *temp=pRoot->left;//定义一个新节点等于根节点的左子树 pRoot->left=pRoot->right;//将左子树赋值为右子树 pRoot->right=temp;//右子树赋值为存储了左子树的新节点 Mirror(pRoot->left);//递归镜像左子树 Mirror(pRoot->right);//递归镜像右子树 return pRoot; } };
方法二:栈
利用栈的性质先进后出的特性
可以让左子树先进 然后右子树后进,利用先进后出的方式使右子树与左子树进行交换
特例当pRoot为空时,直接返回pRoot
复杂度分析
时间复杂度:O(N),N为树的节点数目,遍历数组;
空间复杂度:O(N),数组存储与读取数据。
代码:
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pRoot TreeNode类 * @return TreeNode类 */ TreeNode* Mirror(TreeNode* pRoot) { // write code here if(pRoot==NULL)return pRoot;//特判若节点为空则返回 stack<TreeNode*>st;//利用栈的先进后出的性质 st.push(pRoot);//将根节点加入栈 while(st.size()){ TreeNode* node =st.top();//新建节点存储栈中节点 st.pop(); if(node->left!=NULL){//若当前节点左子树不为空则加入栈中 st.push(node->left); } if(node->right!=NULL){//若当前节点右子树不为空则加入栈中 st.push(node->right); } TreeNode *tmp=node->left;//交换左右子树 node->left=node->right; node->right=tmp; } return pRoot; } };