返回

二叉树再入门:解锁进阶篇,提升算法新境界!

后端

小星学DSA丨二叉树再入门:解锁进阶篇,提升算法新境界!

前言

欢迎来到小星学DSA系列的第三篇!在上一篇中,我们一起探索了二叉树的基础知识。现在,让我们踏上进阶篇的征程,深入探究广度优先搜索、深度优先搜索和平衡二叉树等核心概念,进一步提升我们的算法技能。

广度优先搜索:层层递进,网罗全局

广度优先搜索(BFS)是一种搜索算法,它从根节点开始,逐层探索二叉树,直到找到目标节点或遍历完所有节点。BFS的优势在于,它能够保证找到最短路径,并且在某些情况下比深度优先搜索(DFS)更有效率。

代码示例

def bfs(root, target):
  queue = [root]
  while queue:
    node = queue.pop(0)  # FIFO
    if node == target:
      return True
    if node.left:
      queue.append(node.left)
    if node.right:
      queue.append(node.right)
  return False

深度优先搜索:纵深探索,洞悉细节

深度优先搜索(DFS)也是一种搜索算法,但它与广度优先搜索不同,DFS从根节点开始,沿着一条路径深入搜索,直到找到目标节点或遇到死胡同。DFS的优势在于,它能够更快速地找到目标节点,并且在某些情况下比广度优先搜索更有效率。

代码示例

def dfs(root, target):
  stack = [root]
  while stack:
    node = stack.pop()  # LIFO
    if node == target:
      return True
    if node.right:
      stack.append(node.right)
    if node.left:
      stack.append(node.left)
  return False

平衡二叉树:左右平衡,高效检索

平衡二叉树是一种特殊的二叉树,它保证任何节点的左右子树的高度差不超过1。这种特性使得平衡二叉树的搜索效率非常高,通常在O(log n)的时间复杂度内即可完成。

代码示例

class Node:
  def __init__(self, value):
    self.value = value
    self.left = None
    self.right = None

def insert(root, value):
  if not root:
    return Node(value)
  if value < root.value:
    root.left = insert(root.left, value)
  else:
    root.right = insert(root.right, value)
  return root

def is_balanced(root):
  if not root:
    return True
  left_height = height(root.left)
  right_height = height(root.right)
  return abs(left_height - right_height) <= 1 and \
         is_balanced(root.left) and is_balanced(root.right)

def height(root):
  if not root:
    return 0
  return 1 + max(height(root.left), height(root.right))

结语

在本次小星学DSA系列的第三篇中,我们一起深入探讨了广度优先搜索、深度优先搜索和平衡二叉树等核心概念。希望这些知识能够帮助你更好地理解二叉树,并在算法面试和实际项目中游刃有余。

在下一篇中,我们将继续探索二叉树的其他高级主题,敬请期待!

附录:思维导图

[思维导图链接]