数据结构与算法专题汇总(十)二叉树基础

1. 概念

父节点,子节点,兄弟节点
根节点,叶子节点
高度:从下往上数的高度,即节点到叶子节点的最长路径
深度:从上往下数,看看有多深。即根节点到该结点经历的边数
层数:深度+1,即从1开始树在第几层
树的高度:根节点的高度
在这里插入图片描述
二叉树,满二叉树,完全二叉树

** 存储 **
链式存储

class BiTreeNode{
	def __init__(self,data,left,right):
		self.data = data
		self.left = left
		self.right = right
}

顺序存储
根结点i,左子节点2i,右子节点2i+1
(堆其实就是完全二叉树!!)

2. 二叉树遍历

前序:

def preOrder(root):
	if root == None:
		return
	print root
	preOrder(root.left)
	preOrder(root.right)

中序:

def inOrder(root):
	if root == None:
		return 
	inOrder(root.left)
	print root
	inOrder(root.right)

后序:

def postOrder(root):
	if root == None:
		return
	postOrder(root.left)
	postOrder(root.right)
	print root

3. 二叉查找树

任意一个节点,其左子树的每个节点的值,都要小于该结点;右子树大于该节点

1. 查找

def find(root,data):
	p = root
	while not p:
		if data < p.data:
			p = p.left
		elif data > p.data:
			p = p.right
		else:
			return p
	return None

2. 插入

def insert(root,data):
	if not root:
		return Node(data)
	p = root
	while not p:
		if data > p.data:
			if not p.right:
				p.right = Node(data)
				return
			p = p.right
		else:
			if not p.left:
				p.left = Node(data)
				return
			p = p.left
				

3. 删除

分三种情况:

  1. 删除的节点没有子节点,直接将父节点中,指向该节点的指针置为null
  2. 删除的节点只有一个子节点,更新父节点中,指向删除节点的指针为指向其子节点
  3. 删除的节点有两个子节点:找到节点的右子树中的最小节点,替换到要删除的节点上(最小结点肯定没有左子节点)
def delete(root,data):
	p = root
	pre = None
	// 先查找data
	while p!=None and p.data!=data:
		pre = p
		if data > p.data:
			p = p.right
		else:
			p = p.left
	if p==None:
		return
	// 要删除的节点有两个子节点
	if p.left != None and p.right != None:
		minP = p.right
		preMinP = p
		while minP.left != None:
			preMinP = minP
			minP = minP.left
		p.data = minP.data
		// 交换后变化为删除minp
		p = minP
		pre = preMinP
	
	// 删除节点是叶子或只有一个子节点
	child = Node()
	if p.left != None:
		child = p.left
	elif p.right != None:
		child = p.right
	else:
		child = None
	
	if pre == None: // 删除根节点
		root = child
	elif pre.left == p:
		pre.left = child
	else:
		pre.right = child
	

删除也可标记为已删除,就无需以上操作

3. 支持重复数据的二叉查找树

  1. 通过链表存储相同的数据
  2. 把新的插入数据当作大于该节点的值来处理
    查找数据时,遇到值相同的节点,需要继续在右子树查找,直至叶子节点
    删除数据时,需要将所有的节点删除

4. 散列表和二叉树

  1. 散列表无序存储,输出有序数据需要先排序;二叉树只需要中序遍历就可有序,时间复杂度为O(n)
  2. 散列表耗时,且散列冲突时不稳定;二叉树有平衡二叉树解决不稳定的问题,时间复杂度保持在O(logn)
  3. 由于哈希冲突,实际查找速度可能大于O(logn);且哈希函数耗时大
  4. 散列表构造复杂,需考虑散列函数的设计、冲突解决办法、扩容、缩容等。平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。
  5. 为了避免过多的散列冲突,散列表装载因子不能太大,特别是基于开放寻址法解决冲突的散列表,不然会浪费一定的存储空间。

二叉树相关来leetcode

leetcode 104 二叉树的最大深度

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        leftLength = 1
        rightLength = 1

        p = root
        if p.left!=None:
            leftLength = 1+self.maxDepth(p.left)
        if p.right!=None:
            rightLength = 1+self.maxDepth(p.right)
        return leftLength if leftLength>=rightLength else rightLength

leetcode 450 删除二叉搜索树中的节点

注意pre的变化;
有两个节点时,取右子树的最小的节点
所以minP = p.right
preMinP = p

class Solution:
    def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
        p = root
        pre = None
        while p != None and p.val != key:
            pre = p
            if key > p.val:
                p = p.right
            else:
                p = p.left
        if p == None:
            return root
        
        # 有两个节点
        if p.left != None and p.right != None:
            minP = p.right
            preMinP = p
            while minP.left != None:
                preMinP = minP
                minP = minP.left
            p.val = minP.val
            p = minP
            pre = preMinP
        
        # 一个或无子节点
        child = TreeNode()
        if p.left != None:
            child = p.left
        elif p.right != None:
            child = p.right
        else:
            child = None
        
        if pre == None:
            root = child
        elif pre.left == p:
            pre.left = child
        elif pre.right == p:
            pre.right = child
        return root
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值