二叉树【算法】

基本概念

在了解二叉树之前,我们需要知道什么是树这个数据结构。
一颗树上面有很多树枝,而树枝上面又有很多树枝,这些树枝是可以扩展的,但它终究是有限的。因为长到一定程度,它就会停止分支。因此对于我来说树是 由根节点自上向下自左向右地扩展分支的有限数据集(根节点可以是不固定的)

度 高度 深度 层次

节点的度:一个节点含有的子节点的个数;
度为零的节点称为叶节点或终端节点;
树的度:一棵树中,最大的节点的度;
节点的层次:从最顶部根开始定义起,最顶部根为第1层,最顶部根的子节点为第2层,以此类推;
树的高度或深度:树中最大的节点的层次,高度从下往上,深度从上往下;

二叉树

来源于力扣

class TreeNode:
	def __init__(self, val=0, left=None, right=None):
		self.val = val
		self.left = left
		self.right = right

对于我来说每个节点不超过两个分支的树称为二叉树
树的遍历方式:前序 中序 后序 层序
二叉树的分类:满二叉树、完全二叉树、排序二叉树平衡二叉树哈夫曼树

前序遍历

根 -> 左 -> 右
前序遍历首先访问最顶部根节点,然后遍历最顶部根节点的左子树,最后遍历最顶部根节点的右子树。
以上面二叉树的图片为例前序遍历结果为:FBADCEGIH

def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
	if root == None: return []
    return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)

力扣题目:144. 二叉树的前序遍历

中序遍历

左 -> 根 -> 右
中序遍历是先遍历最顶部根节点的左子树,然后访问最顶部根节点,最后遍历最顶部根节点的右子树。
以上面二叉树的图片为例中序遍历结果为:ABCDFGHI

def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
    if root == None: return []
    return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

力扣题目:94. 二叉树的中序遍历

后序遍历

左 -> 右 -> 根
后序遍历是先遍历最顶部根节点的左子树,然后遍历最顶部根节点的右子树,最后访问最顶部根节点。
以上面二叉树的图片为例后序遍历结果为:ACEDBHIGF

def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
    if root == None: return []
    return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]

力扣题目:145. 二叉树的后序遍历

层序遍历

自上而下自左向右,逐层遍历树
以上面二叉树的图片为例后序遍历结果为:FBGADICEH

力扣题目:102. 二叉树的层序遍历
广度优先搜索(BFS)

排序二叉树

二叉树中任意节点的左子节点小于该节点,右子节点大于该节点。
力扣题目:剑指 Offer II 056. 二叉搜索树中两个节点之和

平衡二叉树

二叉树中任意节点的左右两个子树的高度或深度之差的绝对值不超过 1 。
力扣题目:110. 平衡二叉树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hjhcos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值