檢查一棵二叉樹是否為二叉搜尋樹

2021-09-24 08:33:58 字數 1045 閱讀 5115

檢查一顆二叉樹是否為二叉搜尋樹

首先,什麼是二叉搜尋樹?

二叉搜尋樹左子樹中任意節點值小於根節點;右子樹中任意節點值大於根節點;左右子樹都必須是二叉查詢樹,不允許存在重複節點

不過這裡還有一點需要注意。讓我們看下面這棵樹。

儘管每個節點都比左子節點大,比右子節點小,但這並不是一棵二叉搜尋樹。其中8的位置不對,比根節點6要大。

更準確地說,成為二叉搜尋樹的條件是:所有左邊的節點必須小於當前節點,而當前節點必須小於所有右邊節點。

利用這一點,我們可以通過自上而下傳遞最小和最大值來解決這個問題。在迭代遍歷整個樹的過程中,我們會用逐漸變窄的範圍來檢查各個節點。

#include

#include

"binarytree.h"

#include

using

namespace

std;

bool

issearchtree

(const binarytreenode* proot, int min, int max)

// 測試**

// 二叉查詢樹

// 6

// / \

// 3 9

// /\ / \

// 2 8 7 10

bool

test

()int

main

()複製**

該解法的時間複雜度是o (n ), 其中n 為整棵樹的節點數。我們可以證明這已經是最佳做法,因為任何演算法都必須訪問全部n 個結點。

因為用了遞迴,對於平衡樹,空間複雜度是o (logn )。在呼叫棧上,共有o (logn )個遞迴呼叫,因為遞迴的深度最大會到這棵樹的深度。

記住,在遞迴演算法中,一定要確定終止條件以及節點為空的情況得到妥善處理。

[1] c++中整數最值的表示方法

[2] 《程式設計師面試金典》

判斷一棵二叉樹是否為二叉搜尋樹

答案 自 由裁判實現,細節不表 bool isbst bintree t intmain 你的 將被嵌在這裡 2這種判斷方法是錯誤的,如下面例子所示,節點4處於根節點3的左子樹中,但是函式檢測到這棵樹是bst.判斷是否為bst 2bool isbst bintree t 36 7 如果是一顆二叉查詢...

判斷一棵二叉樹是否為搜尋二叉樹和完全二叉樹

判斷一棵二叉樹是否為搜尋二叉樹和完全二叉樹 給定一棵二叉樹,已經其中沒有重複值的節點,請判斷該二叉樹是否為搜尋二叉樹和完全二叉樹。輸入描述 第一行輸入兩個整數 n 和 root,n 表示二叉樹的總節點個數,root 表示二叉樹的根節點。以下 n 行每行三個整數 fa,lch,rch,表示 fa 的左...

判斷一棵樹是否為搜尋二叉樹,是否為完全二叉樹

搜尋二叉樹 一棵樹上任何乙個節點為頭的子數,左子樹都比它小,右子樹都比它大 只要中序遍歷的結果是依次公升序的,它就是平衡二叉樹 include include using namespace std class isbstandcbt bool isbst node head else return...