18 二叉树的镜像

题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。

二叉树的镜像定义:源二叉树
    	    8
    	   /      	  6   10
    	 / \  /     	5  7 9 11
    	镜像二叉树
    	    8
    	   /      	  10   6
    	 / \  /     	11 9 7  5
 1 /**
 2 public class TreeNode {
 3     int val = 0;
 4     TreeNode left = null;
 5     TreeNode right = null;
 6     public TreeNode(int val) {
 7         this.val = val;
 8     }
 9 }
10 */
11 public class Solution {
12     public void Mirror(TreeNode root) {
13         //考虑特殊情况,根为空,或者只有一个根节点
14         if(root == null)
15             return;//如果是void的话,该怎么返回
16         if(root.left == null && root.right == null)
17             return;
18         TreeNode temp = null;
19         //采用了递归的方法
20         if(root!=null){
21             temp = root.left;
22             root.left = root.right;
23             root.right = temp;
24             Mirror(root.left);
25             Mirror(root.right);
26         }
27     }
28 }

if (root.left != null)
                Mirror(root.left);
            if (root.right != null)
                Mirror(root.right);

最后两个if可以不需要

为啥不需要,加上判断程序不是更稳定么。

不加if逻辑上没问题。但是加上if判断会提升性能,因为不符合条件的不会调用函数,减少了不必要的函数调用,也就减少开销,提高了效率。可以测试下有if和没有if的各自运行时间。

加了if会增加判断条件的时间,但递归少了一层,不加if运行时间会减少,但多了一层递归,空间增加了

递归函数本身就需要时间来运行。可以把这个情况想得极端一点,假设这个函数里的操作都很耗时,那我们是多调用一次或者几次这个函数耗费的时间长,还是用if判断的时间长呢?很明显用if来减少函数的调用是更好的选择。



原文地址:https://www.cnblogs.com/shareidea94/p/11118964.html

时间: 2024-07-30 21:23:08

18 二叉树的镜像的相关文章

刷题18 二叉树的镜像

描述:  操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像示例: 源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 很容易的想到了递归: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) {

剑指Offer 18. 二叉树的镜像 (二叉树)

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 题目地址 https://www.nowcoder.com/practice/564f4c26aa584921bc75623e48ca3011?tpId=13&tqId=11171&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-i

[剑指Offer] 18.二叉树的镜像

[思路1]递归,所有孩子交换再分别递归左右子树 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 };*/ 10 class Solution { 11 public: 12 void Mirror(TreeNode *pRoot) { 13 if(p

剑指offer 18. 面试思路 二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 解题思路:使用递归将左右结点交换 代码如下: public class Mirror { public void Mirror(TreeNode root) { if (root==null) { root=null; }else { //交换左右结点 TreeNode node=root.le

【剑指offer】十二,二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 分析:镜像的递归定义就是将原有二叉树中节点的左右子树对调.代码如下: 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solut

二叉树生成镜像

1 #include <stdio.h> 2 #include <iostream> 3 #include <set> 4 #include <unordered_set> 5 #include <map> 6 #include <queue> 7 #include <vector> 8 #include <string> 9 #include <stack> 10 11 using std::co

剑指OFFER之二叉树的镜像(九度OJ1521)

题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩子,紧接着是右孩子的编号.C

【二叉树】二叉树的镜像

操作给定的二叉树,将其变换为源二叉树的镜像. 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 16 // 后序遍历的一个变型:递归地交换孩子节点的左右孩子,

九度oj题目1521:二叉树的镜像

题目1521:二叉树的镜像 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2061 解决:560 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci=’l’表