Python Binary Tree 二叉树 数据结构

发布于 2022-02-06 13:16:17 字数 2160 浏览 1020 评论 0

基本概念

  • 结点、父结点、子结点、兄弟结点;结点的度:结点的子树个数
  • 层数、深度、高度、结点的度
  • 满二叉树:除了叶结点,其它所有结点都有两个子结点(国内定义:除最后一层全为叶结点外,其它的层的每个结点都有两个子结点)
  • 完全二叉树:除最后一层外,其它层全满,最后一层的叶结点必须从左到右填满

二叉树的遍历

class treeNode:
  def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None

深度优先搜索(Depth First Search, DFS)

非递归的版本在完整代码中

前序遍历 PreOrder Traversal:根-左结点-右结点

def preorder(root):
  if root is None:
    return []
  return [root.val] + preorder(root.left) + preorder(root.right)

中序遍历 InOrder Traversal:左结点-根-右结点

后序遍历 PostOrder Traversal:左结点-右结点-根

广度优先搜索(Breadth First Search, BFS)

层次遍历 LevelOrder Traversal

def level_order(root):
  if not root:
    return []
  res = []
  nodequeue = [root]
  while nodequeue:
    root = nodequeue.pop(0)
    res.append(root.val)
    if root.left:
      nodequeue.append(root.left)
    if root.right:
      nodequeue.append(root.right)
  return res

时间复杂度:需要遍历每个结点,故为O(n)

空间复杂度:由于每个结点都要先进行存储再弹出,故空间复杂度为O(n)

二叉树的后序遍历,非递归版本:非递归的后序遍历是 hard 难度,所以专门在这里写一下。有下面几种思路:

前序遍历是“根-左-右”,稍微改一下,就可以变成“根-右-左”,而将最后的结果倒序输出,就是后序遍历“左-右-根”的顺序了。时间复杂度依然为 O(n):

def postorder_wh1(root):
  if root is None:
    return []
  res = []
  nodestack = []
  while nodestack or root:
    if root:
      res.append(root.val)
      nodestack.append(root)
      root = root.right
    else:
      root = nodestack.pop()
      root = root.left
  # res1 用来存放 res 的倒序输出,也可以直接使用res[::-1]
  res1 = []
  for i in range(len(res)):
    res1.append(res.pop())
  return res1

使用两个栈实现,这个思路也比较易于理解。后序遍历是 左-右-根,所以对于一个栈来说,应该先 push 根结点,然后 push 右结点,最后 push 左结点:

def postorder_wh2(root):
  if root is None:
    return []
  res = []
  nodestack = [root]
  while nodestack:
    root = nodestack.pop()
    res.append(root)
    if root.left:
      nodestack.append(root.left)
    if root.right:
      nodestack.append(root.right)
  # 此时res中存放了倒序的结点,使用res1将其倒序输出并取结点的值
  res1 = []
  for i in range(len(res)):
    res1.append(res.pop().val)
  return res1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文