2022年 11月 5日

二叉树的代码构建python实现

python实现二叉树和二叉树遍历可以拆分为以下几步:

一 构建结点Node:

我们知道二叉树的结点Node,可以有数据域,左孩子,和右孩子,三部分,那么我们就建结点类(如果基本概念不明白,可以先百度一下树和二叉树的一些定义,快速理解下)

  1. class Node(object):
  2. def __init__(self,item):
  3. """
  4. param: self.elem 是结点的数据域
  5. self.lchild 是结点的左孩子
  6. self.rchild 是结点的右孩子
  7. """
  8. self.elem = item
  9. self.lchild = None
  10. self.rchild = None

二 利用上面的结点构建一个树类

  1. class Tree(object):
  2. def __init__(self):
  3. self.root = None

好,完了

开什么玩笑,打你喔,空数也是一棵树嘛

树添加结点的方法

  1. def add(self,item):
  2. """
  3. param: item 是传进来来的数据,我们要实例化一个结点取接收他,但是他的位置要放在树梢,不能乱插入
  4. queue 我们创建一个队列来接收和弹出结点,这样我们找到结点需要接收的位置
  5. """
  6. node = Node(item)
  7. if self.root is None:
  8. """如果根结点是None,是一颗空数,我们就把node赋值给root,那么下面的while循环是不会受影响的,因为是队列[None]的bool值是True"""
  9. self.root = node
  10. return
  11. queue = [self.root]
  12. while queue:
  13. """队列的弹出要加0,与栈相仿"""
  14. cur_node = queue.pop(0)
  15. if cur_node.lchild is None:
  16. """这里有空位,我们插入结点,如果能插入,就完事了"""
  17. cur_node.lchild = node
  18. return
  19. else:
  20. """cur_node的左孩子我们放进队列中,下次循环左子结点"""
  21. queue.append(cur_node.lchild)
  22. """同理对右边的操作一样,还是手敲下吧"""
  23. if cur_node.rchild is None:
  24. cur_node.rchild = node
  25. return
  26. else:
  27. queue.append(cur_node.rchild)

广度遍历(又叫层次遍历,是一层一层从左到右的数下去)

  1. def breadth_travel(self):
  2. """广度遍历与结点的添加非常相似,广度遍历不用插入结点了,在循环里面的条件和添加的相仿"""
  3. if self.root is None:
  4. return
  5. queue = [self.root]
  6. while queue:
  7. cur_node = queue.pop(0)
  8. # 我们打印看看结点的遍历顺序对不对
  9. print(cur_node.elem)
  10. if cur_node.lchild is not None:
  11. # 扔进队列循环
  12. queue.append(cur_node.lchild)
  13. if cur_node.rchild is not None:
  14. queue.append(cur_node.rchild)

深度遍历:前序 中序 后序遍历

这些最好画图去理解下,代码用递归的非常简单

  1. # 前序遍历
  2. def preorder(self,node):
  3. if node is None:
  4. return
  5. # 下面三行代码顺序,深度先序遍历是先根结点,再左孩子,再右孩子
  6. print(node.elem)
  7. self.preorder(node.lchild)
  8. self.preorder(node.rchild)
  9. # 中序遍历
  10. def inorder(self,node):
  11. if node is None:
  12. return
  13. # 下面三行代码顺序,
  14. self.preorder(node.lchild)
  15. print(node.elem)
  16. self.preorder(node.rchild)
  17. # 后序遍历
  18. def portorder(self,node):
  19. if node is None:
  20. return
  21. # 下面三行代码顺序,
  22. self.preorder(node.lchild)
  23. self.preorder(node.rchild)
  24. print(node.elem)