判斷一棵樹是否為二叉搜索樹(二叉排序樹) python


  輸入一棵樹,判斷這棵樹是否為二叉搜索樹。首先要知道什么是排序二叉樹,二叉排序樹是這樣定義的,二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹

  (1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

  (2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

  (3)左、右子樹也分別為二叉排序樹;

  (4)沒有鍵值相等的節點

  #方法1,直接判斷

  直接判斷的關鍵在於不能只是單純地判斷根、左、右三個節點的大小關系,左子樹的右節點不僅要大於父節點,還要小於父節點的父節點,右子樹的左節點不僅要小於父節點,還要大於父節點的父節點。判斷代碼如下。

class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def isValidBST(self, root): """ :type root: TreeNode :rtype: bool """
        if not root: return True def isBSTHelper(node, lower_limit, upper_limit): #節點值應大於下限,小於上限
            if lower_limit is not None and node.val <= lower_limit: return False if upper_limit is not None and upper_limit <= node.val: return False #隨着向下遍歷,對於左子樹,被不斷更新的是上限值(必須小於其父節點),對於右子樹,被不斷更新的是下限值(必須大於其父節點)
            left = isBSTHelper(node.left, lower_limit, node.val) if node.left else True if left: right = isBSTHelper(node.right, node.val, upper_limit) if node.right else True return right else: return False return isBSTHelper(root, None, None)

  #2 利用中序遍歷

  根據二叉排序樹的特點,按照中序遍歷的順序,應當符合當前遍歷到的節點值大於前一個遍歷到的節點值,即中序遍歷序列是一個有序序列,可以直接對中序遍歷得到的序列進行判斷,也可以在遍歷的過程中進行判斷。第二種方法的判斷代碼如下

 def isbst(self,node): global lastvalue lastvalue=float('-inf')    #遍歷的前一個節點的值
        def isbst2(node): global lastvalue if node==None: return True if isbst2(node.left) is not True: return False if node.val<lastvalue: return False lastvalue=node.val#更新
            if isbst2(node.right) is not True: return False return True return isbst2(node)

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM