代码随想录算法训练营第42期 第十四天| 226.翻转二叉树 、101. 对称二叉树 、 104.二叉树的最大深度、111.二叉树的最小深度

一、 226.翻转二叉树 

题目:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]


学习链接:翻转二叉树

状态:做出来了

细节之处:1(代码里面)

思路:这道题可以使用前后序来进行反转,中序比较麻烦,思路就是在用前序遍历的时候,来交换节点。

class Solution {
    public TreeNode invertTree(TreeNode root) {
			preOrder(root);
			return root;

    }
	public static void preOrder(TreeNode root){
		if(root==null)return;
		TreeNode temp=root.left;
		root.left=root.right;   //1 前序遍历的方式
		root.right=temp;
		preOrder(root.left);
		preOrder(root.right);
	}
}

二、101. 对称二叉树

题目:

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

学习链接:对称二叉树

状态:做出来了 

细节之处:1 2 3 4 5 6 7(代码里面)

思路:即然是对称二叉树,而且以根节点为对称轴,所以递归的时候,对根节点的左右子树进行遍历,注意这里只能用后后序遍历的方式,因为中节点需要知道其子树是否对称,并且外侧对外侧,内测对内存,这里要注意终止条件比较多,需要想清楚。 

class Solution {
    public boolean isSymmetric(TreeNode root) {
		return compareTo(root.left,root.right);
    }
	public static boolean compareTo(TreeNode left,TreeNode right){
		if(left==null&&right!=null)return false;  //1 当左子树为空,右子树不为空,肯定不对称
		if(right==null&&left!=null)return false;  //2 当右子树为空,左子树为空,不对称=
		if(left==null&&right==null)return true;   //3 当左子树和右子树都为空是,对称
		if(left.val!=right.val)return false;      //4 若值不相等,不对称
		boolean outside= compareTo(left.left,right.right);//5 获取外侧的情况
		boolean inside= compareTo(left.right,right.left);//6 获取内侧的情况
		boolean result=outside&&inside;    //7 内外侧都ture才为true
		return result;



	}
}

思路: 

三、104.二叉树的最大深度

题目:

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

学习链接:二叉树的最大深度

状态:做出来了 

细节之处: 1 2 3(代码里面)

思路: 这道题就比较容易了,使用前后序都比较方便,在这里使用后序,遍历每个节点加一就行了,左右子树取最大值

class Solution {
    public int maxDepth(TreeNode root) {
		return getMax(root);
    }
	public static int getMax(TreeNode root){
		if(root==null)return 0;
		int left= getMax(root.left)+1;   //1 获取左子树的最大深度
		int right=getMax(root.right)+1;  //2 获取右子树的最大深度
		return Math.max(left,right);  //3 返回当前层最大值
	}
}

四、111.二叉树的最小深度 

题目:

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:2


学习链接:二叉树的最小深度

状态:做出来了 

细节之处:1 2 3(代码里面)

思路: 表面上和最大深度一样,但这里有坑,因为最小深度不算子树为空的情况,素以要进行特殊处理。

class Solution {
    public int minDepth(TreeNode root) {
		if(root==null)return 0;
			return getMin(root);
    }
	public static int getMin(TreeNode root){
			if(root==null)return 0;
			int left= getMin(root.left)+1;
			int right=getMin(root.right)+1;
			if(left==1&&right!=1)return right;//1 当左子树为空,右子树不为空,返回右子树深度
			if(right==1&&left!=1)return left;/2 当右子树为空,左子树不为空,返回左子树深度
			return Math.min(left,right);//3 返回当前层最小的深度

	}
}

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值