数据结构-二叉树的存储与遍历

二叉树是一种常用的数据结构,其数据结构保证一个节点至多有两个孩子。

下面就二叉树的存储和三种遍历方式实现进行记录;每个节点时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()

 

posted @ 2021-01-23 11:06  flag_HW  阅读(211)  评论(0)    收藏  举报