Python实现二叉树结构与进行二叉树遍历的方法详解
admin
2023-08-02 12:54:02
0

二叉树的建立

2016524100535096.png (500×249)

使用类的形式定义二叉树,可读性更好

class BinaryTree:
  def __init__(self, root):
    self.key = root
    self.left_child = None
    self.right_child = None
  def insert_left(self, new_node):
    if self.left_child == None:
      self.left_child = BinaryTree(new_node)
    else:
      t = BinaryTree(new_node)
      t.left_child = self.left_child
      self.left_child = t
  def insert_right(self, new_node):
    if self.right_child == None:
      self.right_child = BinaryTree(new_node)
    else:
      t = BinaryTree(new_node)
      t.right_child = self.right_child
      self.right_child = t
  def get_right_child(self):
    return self.right_child
  def get_left_child(self):
    return self.left_child
  def set_root_val(self, obj):
    self.key = obj
  def get_root_val(self):
    return self.key

r = BinaryTree(\'a\')
print(r.get_root_val())
print(r.get_left_child())
r.insert_left(\'b\')
print(r.get_left_child())
print(r.get_left_child().get_root_val())
r.insert_right(\'c\')
print(r.get_right_child())
print(r.get_right_child().get_root_val())
r.get_right_child().set_root_val(\'hello\')
print(r.get_right_child().get_root_val())

Python进行二叉树遍历

需求:
python代码实现二叉树的:
1. 前序遍历,打印出遍历结果
2. 中序遍历,打印出遍历结果
3. 后序遍历,打印出遍历结果
4. 按树的level遍历,打印出遍历结果
5. 结点的下一层如果没有子节点,以‘N\’代替

方法:
使用defaultdict或者namedtuple表示二叉树
使用StringIO方法,遍历时写入结果,最后打印出结果
打印结点值时,如果为空,StringIO()写入‘N \’
采用递归访问子节点
代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# test tree as below:
\'\'\' 1 / \\ / \\ / \\ / \\ 2 3 / \\ / \\ / \\ / \\ 4 5 6 N / \\ / \\ / \\ 7 N N N 8 9 / \\ / \\ / \\ N N N N N N \'\'\'

from collections import namedtuple
from io import StringIO

#define the node structure
Node = namedtuple(\'Node\', [\'data\', \'left\', \'right\'])
#initialize the tree
tree = Node(1,
      Node(2,
         Node(4,
           Node(7, None, None),
           None),
         Node(5, None, None)),
      Node(3,
         Node(6,
           Node(8, None, None),
           Node(9, None, None)),
         None))
#read and write str in memory
output = StringIO()


#read the node and write the node\'s value
#if node is None, substitute with \'N \'
def visitor(node):
  if node is not None:
    output.write(\'%i \' % node.data)
  else:
    output.write(\'N \')


#traversal the tree with different order
def traversal(node, order):
  if node is None:
    visitor(node)
  else:
    op = {
        \'N\': lambda: visitor(node),
        \'L\': lambda: traversal(node.left, order),
        \'R\': lambda: traversal(node.right, order),
    }
    for x in order:
      op[x]()


#traversal the tree level by level
def traversal_level_by_level(node):
  if node is not None:
    current_level = [node]
    while current_level:
      next_level = list()
      for n in current_level:
        if type(n) is str:
          output.write(\'N \')
        else:
          output.write(\'%i \' % n.data)
          if n.left is not None:
            next_level.append(n.left)
          else:
            next_level.append(\'N\')
          if n.right is not None:
            next_level.append(n.right)
          else:
            next_level.append(\'N \')

      output.write(\'\\n\')
      current_level = next_level


if __name__ == \'__main__\':
  for order in [\'NLR\', \'LNR\', \'LRN\']:
    if order == \'NLR\':
      output.write(\'this is preorder traversal:\')
      traversal(tree, order)
      output.write(\'\\n\')
    elif order == \'LNR\':
      output.write(\'this is inorder traversal:\')
      traversal(tree, order)
      output.write(\'\\n\')
    else:
      output.write(\'this is postorder traversal:\')
      traversal(tree, order)
      output.write(\'\\n\')

  output.write(\'traversal level by level as below:\'+\'\\n\')
  traversal_level_by_level(tree)

  print(output.getvalue())

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...