Python编写二叉树遍历

二叉树

树的特征和定义

  树是一种重要的非线性数据结构,直观来看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很像自然界中的树那样,树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示,树在计算机领域中也得到广泛应用,如在编译源程序时,可用树表示源程序的语法结构,有如在数据库系统中,树型结构也是信息的重要组织形式之一,一切具有层次关系的问题都可用树来描述。
在这里插入图片描述

树的类型

(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
(3)平衡二叉树——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

树的相关术语:

树的结点(node):包含一个数据元素及若干指向子树的分支;
孩子结点(child node):结点的子树的根称为该结点的孩子;
双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲;
兄弟结点:同一双亲的孩子结点; 堂兄结点:同一层上结点;
祖先结点: 从根到该结点的所经分支上的所有结点
子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙
结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;
树的深度:树中最大的结点层
结点的度:结点子树的个数
树的度: 树中最大的结点度。
叶子结点:也叫终端结点,是度为 0 的结点;
分枝结点:度不为0的结点;
有序树:子树有序的树,如:家族树;
无序树:不考虑子树的顺序;

二叉搜索树

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

二叉树的遍历

遍历即将树的所有结点访问仅且访问一次,按照根节点位置的不同分为前序遍历,中序遍历,后序遍历
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后续遍历:左子树->右子树->根节点

程序示例:

"""
题目:二叉树遍历
version:1.0
作者:假书生@
date:2020.01.30
"""
class treenode(object):   #定义创建树的类
    def __init__(self,data = 0,left = 0,right = 0):
        self.data = data
        self.left = left
        self.right = right
class Btree(object):      # 定义搜索树的类
    def __init__(self,root = 0):
        self.root = root
    def preOrder(self,treenode):    # 前序遍历
        if  treenode is 0 :     # 如果是叶子结点,则退出
            return
        print(treenode.data)    #输出根节点
        self.preOrder(treenode.left)  # 遍历左子树
        self.preOrder(treenode.right)    # 遍历右子树
    def inOrder(self,treenode):    # 中序遍历
        if treenode is 0 :    # 如果是叶子结点,则退出
            return
        self.inOrder(treenode.left)   # 遍历左子树
        print(treenode.data)         #输出根节点
        self.inOrder(treenode.right)   # 遍历右子树
    def postOrder(self,treenode):   # 后序遍历
        if treenode is 0 :   # 如果是叶子结点,则退出
            return
        self.postOrder(treenode.left)   # 遍历左子树
        self.postOrder(treenode.right)  # 遍历右子树
        print(treenode.data)              #输出根节点
n1 = treenode(data=1)
n2 = treenode(2,n1,0)
n3 = treenode(3)
n4 = treenode(4)
n5 = treenode(5,n3,n4)
n6 = treenode(6,n2,n5)
n7 = treenode(7,n6,0)
n8 = treenode(8)
root = treenode('root',n7,n8)
bt = Btree(root)
print("preOrder".center(50,'-'))   # 前序遍历
print(bt.preOrder(bt.root))

print("inOrder".center(50,'-'))   # 中序遍历
print(bt.inOrder(bt.root))

print("postOrder".center(50,'-'))  # 后序遍历
print(bt.postOrder(bt.root))

运行结果:

---------------------preOrder---------------------
root
7
6
2
1
5
3
4
8
None
---------------------inOrder----------------------
1
2
6
3
5
4
7
root
8
None
--------------------postOrder---------------------
1
2
3
4
5
6
7
8
root
None

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章