数据结构-二叉树的存储与遍历
二叉树是一种常用的数据结构,其数据结构保证一个节点至多有两个孩子。
下面就二叉树的存储和三种遍历方式实现进行记录;每个节点时node的一个实例,每个对象存储当前节点的数据以及左右孩子的信息。
二叉树的变量分为前序遍历 中序遍历 后续遍历。
前序遍历:先遍历根再遍历左子树再遍历右子树,每个子树仍然遵循前序遍历
中序遍历:先遍历左子树再遍历根再遍历右子树,每个子树仍然遵循中序遍历
后续遍历:先遍历左子树再遍历右子树再遍历根,每个子树仍然遵循后序遍历
下面是具体实现,此处均使用递归实现。左子树所有节点都比根小右子树所有节点都比根大,子树也符合此规律
下面用例中5为根4为5的左孩子1为4的左孩子 15为5的右孩子 18为15的右孩子 12为15的左孩子 6为12的左孩子
#!/usr/bin/env python # -*- coding:utf-8 -*- class Node(object): #初始化节点 def __init__(self, data): self.left = None self.right = None self.data = data #插入节点 def insertNode(self, data): #判断树是否为空 if self.data: #插入的值小于根则插入左子树 if data < self.data: #判断左子树是否为空,为空直接插入 if self.left is None: #每一个节点的孩子都是一个Node对象 self.left = Node(data) else: #如果左子树不为空则递归调用 self.left.insertNode(data) else: if self.right is None: self.right = Node(data) else: self.right.insertNode(data) else: self.data = data #中序遍历 def midPrint(self): #如果有左子树递归调用,直到叶子结点;递归调用,递归自己压栈 if self.left: self.left.midPrint() #中序遍历的逻辑,先遍历左子树在遍历根,再遍历子右树 print(self.data) if self.right: self.right.midPrint() #先序遍历 def prePrint(self): print(self.data) if self.left: self.left.prePrint() if self.right: self.right.prePrint() #后续遍历 def aftPrint(self): if self.left: self.left.aftPrint() if self.right: self.right.aftPrint() print(self.data) if __name__ == "__main__": root = Node(5) root.insertNode(15) #一直使用root.insertNode每次的self都是从root一级一级往下比较 root.insertNode(18) root.insertNode(12) root.insertNode(4) root.insertNode(1) root.insertNode(6) root.midPrint() root.prePrint()
浙公网安备 33010602011771号