【数据结构】二叉树算法原理详解+代码+面试题

本文详细介绍了二叉树的基本概念,包括定义、性质和两种存储结构。接着讨论了二叉树的遍历方法,如前序、中序、后序和层次遍历。此外,还提供了二叉树的代码实现,并列举了若干经典的面试题目,如求节点个数、树的深度、叶子节点数量等。最后,提到了在LeetCode上的相关二叉树问题,如对称二叉树、最大深度等。
摘要由CSDN通过智能技术生成

一、二叉树基本概念

1、二叉树的概念

二叉树(Binary Tree)是包含n个节点的有限集合,该集合或者为空集(此时,二叉树称为空树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成。
1)有且仅有一个特定的称为根Root的结点。
2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每个集合本身又是一个棵树,并称为根的子树。
在这里插入图片描述
还有一些其他的概念:
1、跟节点:树的顶端节点
2、分支节点:至少有一个子节点的节点
3、度:节点所拥有的子树个数
4、边:一个节点到另一个节点之间的连接
5、路径:连接节点和其后代的节点之间的节点和边的序列
6、节点的层数:从根结点到该节点的所有节点个数
7、 节点的深度:从根节点到该节点边的个数
8、节点的高度:节点的高度是该节点和某个叶子之间存在的最长路径上的边的个数。
9、树的高度:根节点的高度

2、二叉树性质:

(1)在二叉树中,第 i层上至多有 2 i − 1 2^{i−1} 2i1个节点(i≥1)
(2)深度为k的二叉树至多有 2 k 2^{k} 2k−1个节点(k≥1)
(3)对一棵二叉树,如果叶子节点的个数为n0,度为2的节点个数为n2,则n0=n2+1
(4)具有n个节点的完全二叉树的深度为⌊log2n⌋+1

在这里插入图片描述

3、二叉树的两种存储结构

  1. 顺序存储

对于完全二叉树而言,可以使用顺序存储结构。但是对于一般的二叉树来说,使用存储结构会有两个缺点,一,如果不是完全二叉树,则必须将其转化为完全二叉树,二是增加了很多虚节点,浪费资源空间。

在这里插入图片描述

  1. 链式存储

这是最常用的一种二叉树存储结构。每个结点设置三个域,即值域,左指针域和右指针域,用data表示值域,lchild和rchild分别表示指向左右子树的指针域。如图所示。

在这里插入图片描述

4、二叉树的遍历

在二叉树的操作中,二叉树的遍历是基本的操作,对于二叉树的遍历操作,主要分为:
前序遍历、中序遍历、后序遍历、层次遍历
实际上二叉树的遍历是一个递归的过程
前序遍历的递推公式:
preOrder® = print r->preOrder(r->left)->preOrder(r->right)
中序遍历的递推公式:
inOrder® = inOrder(r->left)->print r->inOrder(r->right)
后序遍历的递推公式:
postOrder® = postOrder(r->left)->postOrder(r->right)->print r

1、前序遍历:根左右
思路:先访问根,然后遍历左子树,再遍历右子树
ABDHIEJCFKG
在这里插入图片描述

2、中序遍历:左根右
思路:先遍历左子树,再访问根,最后遍历右子树
HDIBEJAFKCG
在这里插入图片描述

3、后序遍历:左右根
思路:先遍历左子树,再遍历右子树,最后访问根
HIDJEBKFGCA
在这里插入图片描述

4、层次遍历
思路:从上到小,从左到右遍历
ABCDEFGHIJK
在这里插入图片描述

二、二叉树代码举例

在这里插入图片描述

二叉树实现代码

# 二叉树的实现
# coding=utf-8

class TreeNode:
	'''二叉搜索树节点的定义'''
	def __init__(self, val):
		self.val = val
		self.left = None
		self.right = None

class OperationTree:
	'''二叉树操作'''
	def create(self, List):
		'''二叉搜索树插入操作'''
		root = TreeNode(List[0])
		lens = len(List)
		if lens >= 2:
			root.left = self.create(List[1])
		if lens >= 3:
			root.right = self.create(List[2])
		return root

	def query(self, root, data):
		'''二叉树查找操作'''
		if root == None:
			return False
		if root.val == data:
			return True
		elif root.left:
			return self.query(root.left, data)
		elif root.right:
			return self.query(root.right, data)

	def PreOrder(self, root):
		'''
		打印二叉树(前序遍历)
		思想:先访问根节点,再先序遍历左子树,然后再先序遍历右子树。总的来说是根—左—右
  		上图先序遍历结果为为:1,2,4,8,9,5,3,6,7
		'''
		if root == None:
			
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值