1. 程式人生 > >判斷二叉樹是否為二叉搜尋樹[Python]

判斷二叉樹是否為二叉搜尋樹[Python]

# -*- coding:utf-8 -*-
class TreeNode():
    def __init__(self,x):
        self.data = x
        self.left = None
self.right = None
# 思路: 二叉搜尋樹的中序遍歷是一個單調遞增的序列,最小值一定在左子樹的最左邊葉子節點,最大值在右子樹的最右邊葉子節點.
#所以,先通過中序遍歷找到最左邊的葉子節點,做最小值,然後後面的值都比他大才對,然後就一層一層的往回返.注意,遍歷過得
#根節點就不再重新遍歷左右子樹了,也直接開始比較.
def SearchTree(root):
    nodes = []
    ever_nodes = []
    b = float
('-Inf') while root or nodes: if ((not root.left) and (not root.right) or root in ever_nodes): if root.data <= b: # 比中序遍歷的前一個值還小,不是二叉搜尋樹 return False else:# 符合條件,那繼續看其他的點是否符合條件,下一個點就得比他還小了 b = root.data if len(nodes): root = nodes.pop() else
: return True continue else: if root.right: nodes.append(root.right) nodes.append(root) if root.left: nodes.append(root.left) ever_nodes.append(root) #遍歷完當前節點,右->中->左 #把左子樹pop出來,以他為根節點繼續往下遍歷直到找到最左邊的葉子節點
root = nodes.pop()#把左邊pop出來,繼續往下遍歷,或者到達終點 a = TreeNode(12) b = TreeNode(5) c = TreeNode(18) d = TreeNode(2) e = TreeNode(9) f = TreeNode(15) g = TreeNode(19) a.left = b a.right = c b.left = d b.right = e c.left = f c.right = g m = SearchTree(a)

相關推薦

判斷一棵是否排序

truct bool 結點 i++ true 源代碼 flag brush %d 判斷二叉排序樹的代碼如下: static boolean IsSearchTree(Bitree *t) { if(!t) //空二叉樹情況 return

【資料結構週週練】020 利用遞迴判斷一棵是否排序

一、二叉排序樹 二叉排序樹可以說是資料結構中相當重要的內容之一啦,前兩次給大家講了二叉排序樹的建立、遍歷與查詢。今天給大家分享的是二叉排序樹的應用,判斷一個二叉樹是否為一棵二叉排序樹。 二叉排序樹的特點大家都知道,左子樹根結點值<根結點<右子樹根結點值,並且中

判斷一棵是否排序

概要 由於二叉排序樹的中序遍歷時得到的一定是個一個升序序列,我們可以根據這一性質,利用中序遍歷進行判定。 演算法 1)設定全域性變數max為無窮小。 2)若樹為空,則返回true。 3

判斷一棵是否搜尋

演算法:使用BFS,在每次入隊前判斷是否滿足BST條件。程式碼:#include <iostream>#include <queue>using namespace std;st

判斷一顆是否搜尋

首先定義一個二叉樹的結構體 struct BinaryTree { int value; BinaryTree* lson; BinaryTree* rson; }; 第一種方法 int maxOf(BinaryTree* root) { i

判斷是否搜尋Python

# -*- coding:utf-8 -*- class TreeNode(): def __init__(self,x): self.data = x self.left = None self.right = None # 思路: 

判斷一顆是否平衡 python 代碼

node 二叉 路徑 tree 過程 二叉平衡樹 個數 turn right   輸入一顆二叉樹,判斷這棵樹是否為二叉平衡樹。首先來看一下二叉平衡樹的概念:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。因此判斷一顆二叉平衡樹的

中和某一值的路徑 python

  輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。   分析:我們可以先從最簡單的情況開始考慮,最簡單的情況就是二叉樹只有一個根節點,判斷根節點的值與期望值是否相同就ok了。二叉樹稍微複雜一點就是根節點還有

[LeetCode] Encode N-ary Tree to Binary Tree 將N編碼

Design an algorithm to encode an N-ary tree into a binary tree and decode the binary tree to get the original N-ary tree. An N-ary tree is a rooted tree

劍指offer-中和某一值的路徑python

相當於深度搜索dfs class Solution: def dfs(self,root,s,li,listAll): li.append(root.val) if not root.left and not root

劍指offer 中和某一值的路徑 Python實現

# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.rig

Leetcode 96 95 不同的搜尋(動態規劃、搜尋) 不同的搜尋II (遞迴、搜尋)

1.不同的二叉搜尋樹 給定一個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種? 示例: 輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹: 1 3 3 2 1 \

Leetcode 96:不同的搜尋 (動態規劃、搜尋)

給定一個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種? 示例: 輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹: 1 3 3 2 1 \

字串形式的維碼轉換維碼圖片

//二維碼展示 js function showEWM(data){ var qrcode = new QRCode(document.getElementById("qrcode"), { width : 220, height

如何判斷一棵是否另一棵的子結構

前兩天有個 朋友問到了這個這個問題,我很感興趣。 其實策略很簡單,用個佇列儲存母樹以層次遍歷的形式儲存可能的子樹的根節點, 然後對這個佇列進行遍歷,以子樹為主與當前要判斷的根節點經行比對,若遍歷完整個佇列,仍未找到,則該子樹不是所要判斷的母樹的子結構。 PS:其實也不用儲

Is It A Red-Black Tree?(判斷一棵是否紅黑

以前沒接觸過這種樹,看了別人的程式碼,加上了詳細的註釋。 思路全在註釋中。   我將測試樣例放上,以便複製。 3 9 7 -2 1 5 -4 -11 8 14 -15 9 11 -2 1 -7 5 -4 8 14 -15 8 10 -7 5 -6 8 15 -11 17

判斷一棵是否另一棵的子結構(JAVA版本)

分析:判斷root1是否為root2的子樹?首先,必須先找到樹1中與樹2的根節點相同的節點,然後判斷從該節點開始root1中是否root2的結構;若有,則返回true,若沒有,則返回false?答案是No! 因為二叉樹root1中可能含有值相同的節點,所以,如果沒有找到,就需要繼續遍歷root1.

判斷一顆是否完全

題目連結:https://oj.ismdeep.com/contest/problem?id=1396&pid=7 H: CBT? 時間限制: 1 s      記憶體限制: 128 MB  &n

判斷任意給定的是否滿

設二叉樹採用二叉連結串列儲存,試編寫一個判斷任意給定的二叉樹是否為滿二叉樹的演算法。 #include<stdio.h> #include<stdlib.h> typedef struct BiTnode   {    &

【劍指offer】判斷是否平衡

平衡二叉樹(Balanced Binary Tree),具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。 第一種遞迴思路,根據定義來,遞迴返回(r-l)<1 and balancetree(r) and bal