内容简介:二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。生成如下所示的二叉树:
二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。
基本结构
节点
class Node(): def __init__(self, val =0): self.val = val self.left = None self.right = None
二叉树
class BinaryTree(): def __init__(self): self.root = None
基本操作
插入节点
def insert_node(self, val): node = Node(val) if not self.root: self.root = node return else: q = [self.root] while True: root = q.pop(0) if root.left is None: root.left = node return elif root.right is None: root.right = node return else: q.append(root.left) q.append(root.right)
判断是否为空
def is_empty(self): if self.root: return True else: return False
统计节点数
def count_node(self, root): if root is None: return 0 else: return 1 + self.count_node(root.left) + self.count_node(root.right)
最大深度
- 递归方式
def max_depth(self, root): if root is None: return 0 return 1 + max(self.max_depth(root.left), self.max_depth(root.right))
- 非递归方式
def max_depth(self, root): if root is None: return 0 depth = 0 queue = [root] while len(queue) != 0: depth += 1 node = queue[0] for i in range(len(queue)): if node.left: queue.append(node.left) if node.right: queue.append(node.right) del queue[0] return depth
构造树
nums = [4, 2, 7, 1, 3, 6, 9] tree = BinaryTree() for i in nums: tree.insert_node(i)
生成如下所示的二叉树:
4 / \ 2 7 / \ / \ 1 3 6 9
打印树
def print_tree(self, root): if root: print(root.val, end=" ") self.print_tree(root.left) self.print_tree(root.right)
反转树
- 递归方式
def invert_tree(self, root): if not root: return root.left, root.right = root.right, root.left if root.left: self.invert_tree(root.left) if root.right: self.invert_tree(root.right)
- 非递归方式
def invert_tree(self, root): if root is None: return root if root.left is not None or root.right is not None: tmp = root.left root.left = root.right root.right = tmp if root.left is not None: self.invert_tree(root.left) if root.right is not None: self.invert_tree(root.right) return root
遍历
前序遍历
- 递归方式
def pre_order(self, root, res=None): if root is None: return [] if res is None: return [] res.append(root.val) self.pre_order(root.left, res) self.pre_order(root.right, res) return res
- 非递归方式
def pre_order(self, root): res = [] if not root: return res stack = [] stack.append(root) while stack: root = stack.pop() res.append(root.val) if root.right: stack.append(root.right) if root.left: stack.append(root.left) return res
中序遍历
- 递归方式
def in_order(self, root, res=None): if root is None: return [] if res is None: return [] self.in_order(root.left, res) res.append(root.val) self.in_order(root.right, res) return res
- 非递归方式
def in_order(self, root): res = [] if not root: return res stack = [] while root or stack: while root: stack.append(root) root = root.left root = stack.pop() res.append(root.val) root = root.right return res
后序遍历
- 递归方式
def post_order(self, root): res = [] if root is None: return [] preorder(root.left, res) preorder(root.right, res) res.append(root.val) return res
- 非递归方式
def post_order(self, root): res_temp = [] res = [] if not root: return res stack = [] stack.append(root) while stack: root = stack.pop() res_temp.append(root.val) if root.left: stack.append(root.left) if root.right: stack.append(root.right) while res_temp: res.append(res_temp.pop()) return res
层次遍历
def level_order(self, root): res = [] if not root: return res level = [root] while level: current = [] new_level = [] for node in level: current.append(node.val) if node.left: new_level.append(node.left) if node.right: new_level.append(node.right) level = new_level res.append(current) return res
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 数据结构 – 用于构建文件系统的数据结构?
- 荐 用Python解决数据结构与算法问题(三):线性数据结构之栈
- 数据结构和算法面试题系列-C指针、数组和结构体
- 请问二叉树等数据结构的物理存储结构是怎样的?
- 数据结构——单链表
- 常用数据结构
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
黑客简史:棱镜中的帝国
刘创 / 电子工业出版社 / 2015-1 / 39.80元
“黑客”,伴随着计算机和互联网而诞生,他们掌握着前沿的计算机和网络技术,能够发现并利用计算机系统和网络的弱点,他们的行为动机多样,因此我们必须对这一群体进行分解,认识他们及其技术的两面性——“黑客”中那些不断拓展技术边界、富于创造力的,和那些掌握技术、却利欲熏心的,就像硬币的两面,谁都无法清晰地辨别是非。相对于主流文化,黑客的行为方式和理念等形成了一种“亚文化”,与主流文化相互作用。一起来看看 《黑客简史:棱镜中的帝国》 这本书的介绍吧!