檢查一顆二叉樹是否是二叉查詢樹

2021-07-11 08:09:19 字數 1641 閱讀 1759

首先,最直觀的一種演算法就是進行一次中序遍歷,然後將每個節點的值儲存在乙個陣列中,然後這個陣列是有序的,那麼這顆樹就是乙個二叉查詢樹。

但是這個演算法有乙個問題,那就是對於存在重複值的二叉查詢樹,它並不能判斷其正確性,比如:

20.

left = 20;

20.right = 20;

兩者在陣列中看起來是一樣的。但是乙個允許重複值存在的二叉查詢樹要約定好,插入乙個重複的值,它應該在左邊還是右邊。

那麼,現在我們假設不考慮有重複值的情況,這個演算法就沒有問題嗎? 還可以優化嗎?

我們不難發現,這個演算法中的陣列只是被用來判斷序列是否有序。我們完全可以在遍歷的時候就進行判斷,從而節約儲存空間。

static

int lastprinted = integer.min_value;

public

static

boolean

isbianrysearchtree(treenode root)

// 如果左子樹不是二叉搜尋樹,則可以直接返回false

if(!isbianrysearchtree(root.left))

// 再來判斷此時跟節點的情況:是否比左子樹的最大值大?

if(root.val < lastprinted)

// 每訪問乙個節點,則更新一下 lastprinted

lastprinted = root.val;

if(!isbianrysearchtree(root.right))

// 最後全部檢查完了,還沒有發現問題,則返回true

return

true;

}

改進後的**的優越性非常明顯。如果有1萬個節點,如果用陣列的話則需要長度達到10000。但是用上面的方法,只用乙個int 值。

先將區間設為[integer.min_value,integer.max_value],然後從根節利用前序遍歷的方式檢查每乙個節點是否在特定區間內。進入左子樹的時候更新max,進入右子樹的時候,更新min。

public

static

boolean

isbinarysearchtree2(treenode root)

private

static

boolean

isbinarysearchtree2(treenode root, int min, int max)

// 檢查根節點是否在區間內

if(root.val > max || root.val < min)else

// 檢查右子樹,右子樹的最小值就是根節點的值

if(!isbinarysearchtree2(root.right, root.val, max))

}return

true;

}

public

static

void

main(string args)

輸出

方法一的判斷 : true

方法二的判斷 : true

方法一的判斷 : false

方法二的判斷 : false

判斷一顆二叉樹是否是平衡二叉樹

方法一,參考 template typename t intdepthtree bstreenode pbs template typename t bool isbalancetree bstreenode pbs intdepthleft depthtree pbs left intdepthr...

判斷一顆二叉樹是否是平衡二叉樹

輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。definition for a binary tree node.public class treenode class solution int left treede...

判斷一顆二叉樹是否為對稱二叉樹

本題源自劍指offer 可以自定以一種對稱前序遍歷,即先遍歷父節點,再訪問右子節點,在訪問左子節點,null節點也訪問,將得到的序列和前序遍歷比較,相同就說明二叉樹是對稱的。遞迴 bool issymmetrical treenode proot bool issymmetricalcore tre...