用python实现二叉搜索树/查找树的简单实现及验证(判断)(三)(栈中根序遍历)

基于栈的中根序深度优先遍历判断法(天然排序,每次比上一个值大即可)。

由搜索树的性质推得中根序深度遍历为一个从小到大的有序序列。所以根据这一性质事情就好办了,只要在遍历过程中加入与前一值得比较判断即能达到目的(复杂度O(n),推荐算法)。代码如下:

def midorder(t):   #中根序遍历比较判断,复杂度O(n)推荐算法
    s = []            #工作栈,为省事直接用list没有从新定义一个栈类再用
    a = []  #一个表记录已经遍历过的结点以便回溯时不再次遍历
    b = float(‘-Inf’) #用于记录上一单位遍历的值,初始化为负无穷
    while t or len(s):  #t不为None或栈不空
        if ((not t.right)and(not t.left))or t in a:  #无子节点或已遍历过
            if t.data <= b:  #比较判断
                return False
            else:
                b = t.data
                if len(s):
                    t = s.pop()    #弹出下一个
                else:
                    return True  #栈空,执行完没False则返回True
            continue  #再从循环体头部开始执行
        else:         #有子节点且没遍历过,依次将右子,中,左子入栈
            if t.right:       
                s.append(t.right)
            s.append(t)
            if t.left:
                s.append(t.left)
            a.append(t)       #记录此节点已遍历过

        t = s.pop()  #弹出下一个

这个是O(n)(约4n,中根序遍历3n)复杂度的算法,已测过可用。其它几篇思路可行,但有的复杂度不是最优,所以只写出来记录下。不放心的也可以再测下:

class Node(object):
    def __init__(self,data,left=0,right=0):
        self.data=data
        self.left=left

        self.right=right

if __name__ == ‘__main__’:
    # 手动创建一课二叉树
    tree = Node(1)
    tree.left = Node(2, None, None)
    tree.right = Node(3, None, None)
    tree.left.left = Node(4, None, None)
    tree.left.right = Node(5, None, None)
    tree.right.left = Node(6, None, None)
    tree.right.right = Node(7, None, None)
    tree.left.left.left = Node(8, None, None)
    tree.left.left.right = Node(9, None, None)
    tree.left.right.left = Node(10, None, None)
    tree.left.right.left.right = Node(11, None, None)
    print(“手动创建一个二叉树(非搜索树)并判断”)
    print(midorder(tree))

    #再创建一个搜索树
    print(“再创建一个二叉树(搜索树)并判断”)
    tree0 = Node(8)
    tree0.left = Node(5, None, None)
    tree0.right = Node(10, None, None)
    
    tree0.left.left = Node(3, None, None)
    tree0.left.right = Node(6, None, None)
    tree0.right.left = Node(9, None, None)
    tree0.right.right = Node(11, None, None)
    tree0.left.left.left = Node(2, None, None)
    tree0.left.left.right = Node(4, None, None)

    print(midorder(tree0))

                                               ————全文完,欢迎转载,但请注明出处!

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/starry0/article/details/79610667
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞