二叉树和遍历的实现

简述

最近因为老板diss我,于是决定开始刷题。这一看大学的东西基本忘光了,现在开始恶补报复老板!!

二叉树

什么是二叉树

二叉树是一种数据结构,它由节点(Nodes)组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树性质

二叉性:每个节点最多有两个子树,分别标记为左子树和右子树。
无序性:二叉树的子树没有顺序之分,但根据特定的遍历规则(如前序、中序、后序遍历),可以区分二叉搜索树、堆等有序二叉树。
层次性:二叉树具有明显的层次结构,从根节点开始,每一层节点数最多是上一层的两倍。
二叉树有多种特殊形态,包括但不限于:

  1. 满二叉树:所有层级都有最大节点数,即每个节点都有两个子节点。
  2. 完全二叉树:除了最后一层外,所有层都是满的,且最后一层的节点都尽可能靠左。
  3. 二叉搜索树(BST):左子树上所有节点的值小于它的根节点的值;右子树上所有节点的值大于它的根节点的值。
  4. 平衡二叉树:左右两个子树的高度差不超过1,如AVL树和红黑树。 堆:一种特殊的完全二叉树,常用于实现优先队列,如最大堆、最小堆。

树的遍历

其实到这里我就直接懵逼了,根据搜索有BFS(广度优先搜索)、DFS(深度优先搜索)、先序遍历、中序遍历、后序遍历。这都是啥关系,最后看了很多,个人总结一下(错误请指正不必客气!):

  1. BFS和DFS这两个是用来做图和树的遍历的两种思想。
  2. 先、中、后遍历方法是针对树这种数据结构遍历的方法(这三种只针对树)
  3. 可以把先、中、后看作是DFS的一个子集,就是说DFS中包含这三个方法
  4. 先:父左右、中:左父右、后:左右父这是顺序

代码实现

咱们重头实现

# 构建如下的二叉树
#       1
#      / \
#     2   3
#    / \   \
#   4   5    6
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class TreeNodeTool:
	def buildTree(self):
		self.root = TreeNode(1)
	    self.root.left = TreeNode(2, TreeNode(4), TreeNode(5))
	    self.root.right = TreeNode(3, None, TreeNode(6))
	
	def bfs_traversal(self):
	    traversal_result = []
	    if not self.root:
	        return traversal_result
	
	    queue = deque([self.root])
	    while queue:
	        current_node = queue.popleft()
	        traversal_result.append(current_node.val)
	        if current_node.left:
	            queue.append(current_node.left)
	        if current_node.right:
	            queue.append(current_node.right)
	    return traversal_result
	
 	def dfs_preorder_traversal(self):
        traversal_result = []
        def dfs (node):
            if not node:
                return
            traversal_result.append(node.val)
            dfs(node.left)
            dfs(node.right)
        dfs(self.root)
        print(f"深度优先搜索(先序遍历):{traversal_result}")
   	def dfs_inorder_traversal(self):
        traversal_result = []
        def dfs (node):
            if not node:
                return
            dfs(node.left)
            traversal_result.append(node.val)
            dfs(node.right)
        dfs(self.root)
        print(f"深度优先搜索(中序遍历):{traversal_result}")	
    def dfs_postorder_traversal(self):
        traversal_result = []
        def dfs (node):
            if not node:
                return
            dfs(node.left)
            dfs(node.right)
            traversal_result.append(node.val)
        dfs(self.root)
        print(f"深度优先搜索(后序遍历):{traversal_result}")
	
if __name__ == '__main__':
    tree_node_tool = TreeNodeTool()
    tree = tree_node_tool.buildTree()
    tree_node_tool.bfs_traversal()
    tree_node_tool.dfs_preorder_traversal()
    tree_node_tool.dfs_inorder_traversal()
    tree_node_tool.dfs_postorder_traversal()
#广度优先搜索:[1, 2, 3, 4, 5, 6]
#深度优先搜索(先序遍历):[1, 2, 4, 5, 3, 6]
#深度优先搜索(中序遍历):[4, 2, 5, 1, 3, 6]
#深度优先搜索(后序遍历):[4, 5, 2, 6, 3, 1]

网上教程千千万,只有这里最全面,看完记得点个赞!!!!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值