檢查一顆二叉樹是否為二叉搜尋樹
首先,什麼是二叉搜尋樹?
二叉搜尋樹左子樹中任意節點值小於根節點;右子樹中任意節點值大於根節點;左右子樹都必須是二叉查詢樹,不允許存在重複節點。
不過這裡還有一點需要注意。讓我們看下面這棵樹。
儘管每個節點都比左子節點大,比右子節點小,但這並不是一棵二叉搜尋樹。其中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...