首页 > 其他分享 >代码随想录day17 || 654 最大二叉树,617 合并二叉树,700 二叉搜索树搜索,98 验证二叉搜索树

代码随想录day17 || 654 最大二叉树,617 合并二叉树,700 二叉搜索树搜索,98 验证二叉搜索树

时间:2024-08-02 12:09:26浏览次数:9  
标签:return val nil 二叉 搜索 二叉树 TreeNode root 节点

645 最大二叉树

func constructMaximumBinaryTree(nums []int) *TreeNode {
	// 思路,算法思路基本等同于通过中序前序构造二叉树
	// 1, 取最大值作为根节点
	// 2, 切割数组
	// 3, 递归左右子树
	if len(nums) == 0 {
		return nil
	}

	// 切割数组取最大值
	max, left, right := getmax(nums)
	var root = &TreeNode{max, nil, nil}
	if len(nums) == 1{
		return root
	}

	// 递归左右子树
	root.Left = constructMaximumBinaryTree(left)
	root.Right = constructMaximumBinaryTree(right)
	return root
}
func getmax(nums []int) (int, []int, []int) {
	var max int
	var index int
	var left, right []int
	for idx, num := range nums {
		if num >= max {
			max = num
			index = idx
		}
	}
	left = nums[0: index]
	if index + 1 <= len(nums) - 1 {
		right = nums[index + 1: len(nums)]
	}
	return max, left, right
}


617 合并二叉树

func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
	// 思路,递归前序遍历构造二叉树
	if root1 == nil && root2 == nil {
		return nil
	}
	if root1 == nil && root2 != nil {
		return root2
	}
	if root1 != nil && root2 == nil {
		return root1
	}

	// 单次递归逻辑前序,根左右
	var root = &TreeNode{root1.Val + root2.Val, nil, nil}
	root.Left = mergeTrees(root1.Left, root2.Left)
	root.Right = mergeTrees(root1.Right, root2.Right)
	return root
}

// 递归秒杀,层序思路大致为,分别遍历两棵树,然后对应节点相构建新的节点加入新队列,然后最终根据队列输出就是新的树

二叉搜索树(Binary Search Tree, 简称 BST)

二叉搜索树是一种特殊的二叉树,它具有以下性质:

  1. 节点值的排列

    • 对于每一个节点 ( n ):
      • 节点 ( n ) 的左子树中的所有节点的值都小于 ( n ) 的值。
      • 节点 ( n ) 的右子树中的所有节点的值都大于 ( n ) 的值。
  2. 递归性质

    • 每个节点的左子树和右子树也都是二叉搜索树。

这种结构使得在二叉搜索树中进行查找、插入和删除操作非常高效,平均时间复杂度为 ( O(\log n) )(在平衡的情况下)。

二叉搜索树的性质

  • 查找:从根节点开始,如果要查找的值小于当前节点的值,则递归地在左子树中查找;如果大于当前节点的值,则在右子树中查找。
  • 插入:从根节点开始,根据值的大小决定插入到左子树还是右子树的适当位置。
  • 删除:分三种情况:
    1. 删除的节点是叶子节点:直接删除。
    2. 删除的节点只有一个子节点:用该子节点替代被删除的节点。
    3. 删除的节点有两个子节点:找到该节点的中序后继或中序前驱,用后继或前驱替代被删除的节点,然后删除后继或前驱。

二叉搜索树的示例

假设我们有一个包含以下值的二叉搜索树:5, 3, 7, 2, 4, 6, 8

构建的二叉搜索树如下:

      5
     / \
    3   7
   / \ / \
  2  4 6  8

// TreeNode 定义二叉搜索树节点
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

// Insert 插入一个值到二叉搜索树
func (t *TreeNode) Insert(val int) {
    if val < t.Val {
        if t.Left == nil {
            t.Left = &TreeNode{Val: val}
        } else {
            t.Left.Insert(val)
        }
    } else {
        if t.Right == nil {
            t.Right = &TreeNode{Val: val}
        } else {
            t.Right.Insert(val)
        }
    }
}

// Search 在二叉搜索树中查找一个值
func (t *TreeNode) Search(val int) *TreeNode {
    if t == nil || t.Val == val {
        return t
    }
    if val < t.Val {
        return t.Left.Search(val)
    }
    return t.Right.Search(val)
}

// Delete 从二叉搜索树中删除一个值
func (t *TreeNode) Delete(val int) *TreeNode {
    if t == nil {
        return nil
    }
    if val < t.Val {
        t.Left = t.Left.Delete(val)
    } else if val > t.Val {
        t.Right = t.Right.Delete(val)
    } else {
        // 找到要删除的节点
        if t.Left == nil {
            return t.Right
        } else if t.Right == nil {
            return t.Left
        }

        // 有两个子节点,找到中序后继
        minRight := t.Right
        for minRight.Left != nil {
            minRight = minRight.Left
        }
        t.Val = minRight.Val
        t.Right = t.Right.Delete(minRight.Val)
    }
    return t
}


700 二叉树搜索

func searchBST(root *TreeNode, val int) *TreeNode {
	// 递归思路,如果根节点大于val,递归右子树,如果小于val,递归左子树,如果等于,返回root
	if root == nil {
		return nil
	}

	if root.Val == val {
		return root
	}

	// 单次递归逻辑
	if root.Val < val {
		return searchBST(root.Right, val)
	}
	if root.Val > val {
		return searchBST(root.Left, val)
	}
	return nil
}
// 递归秒杀

98 验证二叉搜索树

func isValidBST(root *TreeNode) bool {
	// 迭代法思路,中序遍历二叉搜索树得到的数组是单调递增的
	if root == nil {
		return true
	}

	var res []int
	inorder(root, &res)
	return checkOrder(res)
}

func inorder(root *TreeNode, res *[]int) {
	if root == nil {
		return
	}
	inorder(root.Left, res)
	*res = append(*res, root.Val)
	inorder(root.Right, res)
}

func checkOrder(nums []int)bool {
	for i := 0; i < len(nums)-1; i++ {
		if nums[i] >= nums[i+1] {
			return false
		}
	}
	return true
}
var prev *TreeNode
func isValidBST(root *TreeNode) bool {
	// 递归方法,思路同样是中序遍历得到的结果是有序的,所以对于每一层递归,上一个节点值小于下一个节点值
	prev = nil  // tmd 使用全局变量一定要记得在函数中重新归零,不然多次测试可能会互相修改,出现意料之外的错误
	return isValidBSTHelper(root)
}

func isValidBSTHelper(root *TreeNode) bool {
	if root == nil {
		return true
	}

	// 左子树
	left := isValidBSTHelper(root.Left)

	// 当前节点
	if prev != nil && prev.Val >= root.Val {
		return false
	}
	prev = root

	// 右子树
	right := isValidBSTHelper(root.Right)
	return left && right
}

标签:return,val,nil,二叉,搜索,二叉树,TreeNode,root,节点
From: https://www.cnblogs.com/zhougongjin55/p/18338469

相关文章

  • 数据结构:二叉树(链式结构)
    文章目录1.二叉树的链式结构2.二叉树的创建和实现相关功能2.1创建二叉树2.2二叉树的前,中,后序遍历2.2.1前序遍历2.2.2中序遍历2.2.3后序遍历2.3二叉树节点个数2.4二叉树叶子结点个数2.5二叉树第k层结点个数2.6二叉树的深度/高度2.7二叉树查找值为x的结点2.8......
  • bing官方api搜索引擎
    bing官方api搜索引擎1.bingAPI说明微软Bing的搜索API使得开发者能够将Bing的搜索能力集成到自己的应用中,包括对网页、图片、新闻、视频的搜索,以及提供了实体搜索和视觉搜索的功能。这些API支持安全、无广告且能够根据地理位置提供相关信息的搜索结果。BingWebSearch......
  • 解密编程的八大法宝(四)(附二分查找、分治法和图论算法(深度和广度优先搜索、最短路径、最
    算法题中常见的几大解题方法有以下几种::暴力枚举法(BruteForce):这是最基本的解题方法,直接尝试所有可能的组合或排列来找到答案。这种方法适用于问题规模较小的情况,但在大多数情况下效率不高。贪心算法(GreedyAlgorithm):贪心算法在每一步都选择当前看起来最优的解,希望最终能......
  • Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo
    Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo1.前提是咱们的Chatchat服务一起部署好了,可以参考Langchain-Chatchat3.1版本docker部署流程——知识库问答2.搜索引擎DuckDuckGo:该搜索引擎不需要key,但是需要全球上网服务,挂代理。pipinstall-Uduckduckgo_search......
  • 图解平衡二叉树
    平衡二叉树平衡二叉树的背景由于一些众所周知的原因,我们选择了平衡二叉树,好吧,其实就是因为对二叉搜索树的限制太少了,导致在一些特殊的情况下,二叉搜索树不太听话,查找,插入与删除的时间均变成了\(O(n)\)也可以认为,熵增就会更加有序,熵减就会更加自由,这里我们......
  • DAY 15 二叉树part03
      110.平衡二叉树(优先掌握递归)题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 独立完成,感觉还比较好理解12classSolution{13public:14boolisBalanced(TreeNode*root){15if(......
  • 运行期加载时共享库路径搜索优先级实验
    目录前言实验环境目录说明单独测试不配置路径默认路径ld.so.cacheRUNPATHLD_LIBRARY_PATHRPATH优先级测试附录库文件源码主程序源码makefile脚本run_nonerun_defaultrun_ld_so_cacherun_runpathrun_ld_library_pathrun_rpathrun_cmp_all前言《共享库链接和加载时的路径搜索优先......
  • Apifox 7月更新|SAML 单点登录、迭代分支优化、Markdown 历史记录、搜索能力提升
      1新增「组织」架构引入了全新的「组织」概念,提供更灵活的管理结构。企业可以创建「组织」,并在组织内设立多个「团队」,便于大中型企业能够更有效地组织和管理其项目及人员。通过这种方式,企业可以根据自身的组织结构和业务需求,灵活地分配资源和权限,提高整体的协作效率......
  • grep命令详解:文本搜索的利器
    grep命令详解:文本搜索的利器大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!grep是一个强大的命令行工具,用于在文件中搜索特定的文本模式。它是Unix和类Unix系统中最常用的工具之一,广泛应用于系统管理、日志分析、代码查找等场景。本文将详细介绍grep命令......
  • 数据结构----树,二叉树,哈夫曼树相关概念及其实现
    树形结构概述1分层逻辑结构所谓的分层逻辑结构,也称为树形逻辑结构关系,是数据结构中的一种逻辑关系结构,在该逻辑结构关系中的数据元素之间满足一对多的逻辑结构关系:起始数据节点有且仅有一个,没有直接前驱,可以有多个直接后继;末尾数据节点可以多个,有且仅有一个直接前驱,......