首页 > 其他分享 >代码随想录day14 || 226 翻转二叉树,101 对称二叉树, 104 二叉树的最大深度, 111 二叉树的最小深度

代码随想录day14 || 226 翻转二叉树,101 对称二叉树, 104 二叉树的最大深度, 111 二叉树的最小深度

时间:2024-07-30 12:50:48浏览次数:18  
标签:Right return nil 随想录 queue 二叉树 深度 root Left

226 翻转二叉树

func invertTree(root *TreeNode) *TreeNode {
	// 思考,广度优先遍历,对于每一层,翻转其左右子节点

	if root == nil {
		return nil
	}

	queue := list.New()
	queue.PushBack(root)
	size := 1 // 存储每一层的节点个数
	for queue.Len() > 0{
		var count int
		for i:=0; i<size; i++{  // 弹出该层所有的节点
			node := queue.Remove(queue.Front()).(*TreeNode)

			// 将该节点的左右子节点翻转
			if node.Left != nil || node.Right != nil {
				node.Left, node.Right = node.Right, node.Left
			}

			// 将翻转后的子节点入队列
			if node.Left != nil {
				queue.PushBack(node.Left)
				count++
			}
			if node.Right != nil {
				queue.PushBack(node.Right)
				count++
			}
		}
		size = count
	}
	return root
}
// list双向链表实现的队列,插入移除操作复杂度都是1
// 所以时间 遍历翻转每一个节点 n  空间 队列 n

func invertTree(root *TreeNode) *TreeNode {  // 递归参数返回值
	// 递归前序遍历
	if root == nil {  // 递归终止条件
		return nil
	}

	// 交换左右子节点
	if root.Left != nil || root.Right != nil {  // 单次递归逻辑
		root.Left, root.Right = root.Right, root.Left
	}
	invertTree(root.Left)
	invertTree(root.Right)
	return root
}
// 时间复杂度n  空间 如果平衡二叉树logn  如果链表 n
// 递归前序后序遍历都可以直观理解,但是中序时候,需要特殊处理递归逻辑,因为先一步递归左子树之后,处理完交换逻辑左子树变成了右子树,此时往下执行交换右子树就是错误的,所以之后的逻辑应该改成仍然交互左子树

101 判断二叉树对称

func isSymmetric(root *TreeNode) bool {
	// 递归
	if root == nil {
		return true
	}

	return symmetric(root.Left, root.Right)
}

func symmetric(left, right *TreeNode) bool { // 递归参数返回值

	// 递归终止条件
	if left == nil && right != nil ||
		left != nil && right == nil ||
		left != nil && right != nil && left.Val != right.Val {
		// 左空右非空 || 左非空右边空 || 左右数值不相等
		return false
	}

	if left == nil && right == nil {
		return true
	}

	// 最后一种情况,左右非空并且值相等
	// 递归逻辑
	inner := symmetric(left.Left, right.Right)
	outer := symmetric(left.Right, right.Left)
	return inner && outer
}

时间,每个节点遍历一次 n 空间logn

104 最大深度

image

func maxDepth(root *TreeNode) int {
	// 考虑层序遍历
	if root == nil {
		return 0
	}

	queue := list.New()
	queue.PushBack(root)
	dep := 1
	size := 1
	for queue.Len() >0{
		var count int
		for i:=0; i<size; i++ {
			node := queue.Remove(queue.Front()).(*TreeNode)

			if node.Left != nil {
				queue.PushBack(node.Left)
				count++
			}

			if node.Right != nil {
				queue.PushBack(node.Right)
				count++
			}
		}
		if count == 0{
			return dep
		}
		size = count
		dep++

	}
	return dep
}
// 层序遍历每个节点遍历一次,时间n 空间 队列长度最长为n/2 = n

func maxDepth(root *TreeNode) int {
	// 递归方法,深度优先遍历,因为需要不断传递子节点高度给父节点,所以考虑后续遍历,同时根节点高度就是树的深度
	if root == nil {
		return 0
	}

	left := maxDepth(root.Left)
	right := maxDepth(root.Right)
	var res int = right
	if left > right {
		res = left
	}
	return res+1
}

111 最小深度

func minDepth(root *TreeNode) int {
	// 思考层序遍历,终止条件是左右子树都是空
	if root == nil {
		return 0
	}

	queue := list.New()
	queue.PushBack(root)
	dep := 1
	size := 1
	for queue.Len() >0 {
		var count int
		for i := 0; i < size; i++ {
			node := queue.Remove(queue.Front()).(*TreeNode)

			if node.Left == nil && node.Right == nil {
				return dep
			}

			if node.Left != nil {
				queue.PushBack(node.Left)
				count++
			}

			if node.Right != nil {
				queue.PushBack(node.Right)
				count++
			}
		}
		size = count
		dep++
	}
	return dep
}
// 层序遍历每个节点遍历一次,时间n 空间 队列长度最长为n/2 = n

func minDepth(root *TreeNode) int {
	// 递归方法,深度优先遍历,最小深度,终止条件是遇到无叶子的子节点,从上往下传递,中左右前序遍历
	if root == nil {
		return 0
	}

	// 如果左子树为空,递归右子树
	if root.Left == nil {
		return minDepth(root.Right) + 1
	}

	// 如果右子树为空,递归左子树
	if root.Right == nil {
		return minDepth(root.Left) + 1
	}

	// 左右子树都不为空,返回左右子树的最小深度
	leftDepth := minDepth(root.Left)
	rightDepth := minDepth(root.Right)
	return int(math.Min(float64(leftDepth), float64(rightDepth))) + 1
}

标签:Right,return,nil,随想录,queue,二叉树,深度,root,Left
From: https://www.cnblogs.com/zhougongjin55/p/18332121

相关文章

  • Day14 二叉树Part2 递归的应用(二叉树相关)
    任务226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。思路逻辑上,我们知道用递归遍历一棵树,一定会遍历每个节点。因此在遍历的过程中处理即可。考虑递归基,即当节点为空时直接返回。考虑单层递归,为了反转二叉树,如何处理当前节点呢?即如何反转以当......
  • 代码随想录算法训练营第28天 | 贪心进阶
    2024年7月30日题122.买卖股票的最佳时机II上涨就买,下跌就不买。classSolution{publicintmaxProfit(int[]prices){intsum=0;for(inti=1;i<prices.length;i++){sum+=prices[i]-prices[i-1]>0?prices[i]-prices[i-1]:0;......
  • 代码随想录算法训练营第27天 | 初入贪心
    2024年7月29日题455.分发饼干先排序,然后依次分发即可。classSolution{publicintfindContentChildren(int[]g,int[]s){//对于每个孩子胃口,从小到大分配,且给尽可能少的饼干Arrays.sort(g);Arrays.sort(s);intcnt=0;......
  • 代码随想录——完全平方数(Leetcode 279)
    题目链接动态规划动态规划思路:状态定义:定义一个一维数组dp,其中dp[i]表示组成整数i所需的最少完全平方数的数量。状态初始化:将dp数组中的所有元素初始化为Integer.MAX_VALUE,表示初始状态下组成每个整数的完全平方数数量是无限大(即不可能)。但dp[0]需要初始化为0,因为组成......
  • 机器学习:详解是否要使用端到端的深度学习?(Whether to use end-to-end learning?)
    详解是否要使用端到端的深度学习?假设正在搭建一个机器学习系统,要决定是否使用端对端方法,来看看端到端深度学习的一些优缺点,这样就可以根据一些准则,判断的应用程序是否有希望使用端到端方法。这里是应用端到端学习的一些好处,首先端到端学习真的只是让数据说话。所以如果有足够多......
  • 如何在本地设置深度学习中心
    我真的需要在我的电脑上设置一个深度学习中心。我运行的是13900k、4080S和32GB6400MTRam,我知道我想要训练/建模什么,但是看在上帝的份上,我无法在我的个人计算机上设置它。我运行的是Win10,仅供参考。预先感谢尝试了通常的Anaconda安装、Python安装、nVidiacuDNN和T......
  • 关于立体视觉深度估计的一些问题
    目前我正在尝试做一些深度估计方面的工作。以下是我的代码importcv2importnumpyasnpimportmathleft_camera_matrix=np.array([[379.631915328262,-0.102220945295059,315.958769543110],[0,379.732222668215,203.885845031288],......
  • 深度 | LLM会吃了开发人员吗?
    目录达摩克利斯之剑——大模型的时代期待新的超级开发个体史上四次工业革命和同时代的工人们LLM会吃了开发人员吗?不,其实并没有那么危险a.智能化编程由来已久b.进化后的AI编程可以做什么c.智能化AI编程的“月之暗面”d.AI编程vs程序员开发者们,站起来武装......
  • 算法笔记|Day11二叉树
    算法笔记|Day11二叉树☆☆☆☆☆leetcode144.二叉树的前序遍历题目分析代码☆☆☆☆☆leetcode94.二叉树的中序遍历题目分析代码☆☆☆☆☆leetcode145.二叉树的后序遍历题目分析代码☆☆☆☆☆leetcode102.二叉树的层序遍历题目分析代码☆☆☆☆☆leetcode107.......
  • 代码随想录 day39 零钱兑换 | 完全平方数 | 单词拆分
    零钱兑换零钱兑换解题思路还是完全背包的套路,但这次我们要求的是最小值,因此每次遍历的时候我们要找到最小值,每次给dp增加的大小不在是物品的价值而是长度,所以+1。知识点完全背包心得难点在于怎么样找到最小值完全平方数[完全平方数(https://programmercarl.com/0279.完......