操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数 , 二叉树每个节点的值
要求: 空间复杂度 。本题也有原地操作,即空间复杂度 的解法,时间复杂度
比如:
源二叉树
镜像二叉树
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pRoot TreeNode类 * @return TreeNode类 */ public TreeNode Mirror (TreeNode pRoot) { if(pRoot==null) return pRoot; TreeNode left=Mirror(pRoot.left); TreeNode right=Mirror(pRoot.right); pRoot.left=right; pRoot.right=left; return pRoot; } }
/** * 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) { // 时间复杂度O(N),空间复杂度O(N) if (pRoot == nullptr) return nullptr; TreeNode *tmp = pRoot->left; pRoot->left = Mirror(pRoot->right); pRoot->right = Mirror(tmp); return pRoot; } };
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pRoot TreeNode类 * @return TreeNode类 */ public TreeNode Mirror (TreeNode pRoot) { // write code here // 思路 从底层交换 if(pRoot == null){ return null; } TreeNode left = Mirror(pRoot.left); TreeNode right = Mirror(pRoot.right); pRoot.left = right; pRoot.right = left; return pRoot; } }
//递归 TreeNode* Mirror(TreeNode* pRoot) { // write code here if(pRoot==NULL) return NULL; TreeNode*p =pRoot->right; pRoot->right=pRoot->left; pRoot->left=p; Mirror(pRoot->left); Mirror(pRoot->right); return pRoot; }
//非递归 TreeNode* Mirror(TreeNode* pRoot) { // write code here if(pRoot==NULL) return NULL; stack<TreeNode*>st; st.push(pRoot); while(!st.empty()) { TreeNode*top = st.top(); st.pop(); TreeNode*p=top->right; top->right = top->left; top->left=p; if(top->right!=NULL) { st.push(top->right); } if(top->left!=NULL) { st.push(top->left); } } return pRoot; }
# class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param pRoot TreeNode类 # @return TreeNode类 # class Solution: def Mirror(self , pRoot: TreeNode) -> TreeNode: # write code here if not pRoot:return tmp=self.Mirror(pRoot.left) pRoot.left=self.Mirror(pRoot.right) pRoot.right=tmp return pRoot
public TreeNode Mirror (TreeNode pRoot) { //叶子节点都为null或有一个为null都可以处理。 //因为pRoot不为null,没有问题。 if(pRoot != null){ TreeNode temp = pRoot.left; pRoot.left = pRoot.right; pRoot.right = temp; Mirror(pRoot.left); Mirror(pRoot.right); } return pRoot; }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pRoot TreeNode类 * @return TreeNode类 */ public TreeNode Mirror (TreeNode pRoot) { // write code here //使用递归 //递归的结束条件是,当前节点为空,或者是交换完成 //所谓交换,那必然就是三步法 if(pRoot==null) return null; TreeNode tmp = pRoot.left; pRoot.left=Mirror(pRoot.right); pRoot.right=Mirror(tmp); return pRoot; } }
class Solution: def Mirror(self , pRoot ): if not pRoot: return pRoot q = [] #队列 q.append(pRoot) root = pRoot while q: pRoot=q.pop(0) pRoot.left,pRoot.right=pRoot.right,pRoot.left if pRoot.left: q.append(pRoot.left) if pRoot.right: q.append(pRoot.right) return root
function Mirror( pRoot ) { // write code here if(pRoot == null){ return pRoot; } // var temp = pRoot.left; // pRoot.left = pRoot.right; // pRoot.right = temp; [pRoot.left,pRoot.right] = [pRoot.right,pRoot.left]; Mirror(pRoot.left); Mirror(pRoot.right); return pRoot; }
public TreeNode Mirror (TreeNode pRoot) { // write code here if(pRoot==null)return null; //边界处理 //左右 对称当前左右子节点 if(pRoot.left!=null || pRoot.right!=null){ TreeNode temp =pRoot.left; pRoot.left =pRoot.right ; pRoot.right =temp; //对子结构进行反转 Mirror(pRoot.left); Mirror(pRoot.right); } return pRoot; }
##采用递归思想## 1.先处理根节点。若根节点为空,或为单个节点,则直接返回。否则交换左右节点 2.处理根节点的左子树 3.处理根节点的右子树
import java.util.*; public class Solution { public TreeNode Mirror (TreeNode pRoot) { if(pRoot==null) return pRoot; if(pRoot.left==null && pRoot.right==null) return pRoot; //处理根节点,交换左右节点 TreeNode temp=pRoot.left; pRoot.left=pRoot.right; pRoot.right=temp; //处理左子树 Mirror(pRoot.left); //处理右子树 Mirror(pRoot.right); return pRoot; } }
# class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param pRoot TreeNode类 # @return TreeNode类 # class Solution: def Mirror(self , pRoot ): if pRoot: right = self.Mirror(pRoot.left) left = self.Mirror(pRoot.right) pRoot.right = right pRoot.left = left return pRoot # write code here
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pRoot TreeNode类 * @return TreeNode类 */ struct TreeNode* Mirror(struct TreeNode* pRoot ) { if (pRoot == NULL) { return NULL; } struct TreeNode* tmp = pRoot->left; pRoot->left = pRoot->right; pRoot->right = tmp; Mirror(pRoot->left); Mirror(pRoot->right); return pRoot; }