基于栈的中根序深度优先遍历判断法(天然排序,每次比上一个值大即可)。
由搜索树的性质推得中根序深度遍历为一个从小到大的有序序列。所以根据这一性质事情就好办了,只要在遍历过程中加入与前一值得比较判断即能达到目的(复杂度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))
————全文完,欢迎转载,但请注明出处!