判斷是否為二叉搜尋樹(C 實現)

2021-09-26 00:24:18 字數 973 閱讀 9865

給定乙個根結點如何判斷一棵樹是否為二叉搜尋樹呢?下面我們用三種方式來處理這個問題

根據二叉搜尋樹的特徵,二叉搜尋樹的中序遍歷應該為乙個有序集合

對樹進行中序遍歷,將結果儲存在temp陣列中

檢測temp陣列是否為公升序排列,如果是,則為bst,反之則不是

//這裡為了好理解就直接使用遞迴寫

void inorder(treenode* tmp, vector& arr)

bool isbst(treenode* root)

return true;

}

此方法還可以進一步的優化,不用temp陣列,避免使用額外的記憶體開銷。在中序遍歷時使用靜態變數儲存前驅節點,如果當前節點小於前驅節點,則該樹不是bst

bool isbst(treenode *root)

return true;

}

暴力法:該方法的思路最切合二叉搜尋樹的概念(比較當前節點是否比左子樹最大節點大,比右子樹最小結點小)

int maxvalue(treenode *root)

if(root->right != null)

return max;

}int minvalue(treenode *root)

if(root->right != null)

return min;

}bool isbst(treenode *root)

討巧的方法,將樹結點值的範圍確定,所有節點的值滿足該範圍即為二叉搜尋樹

bool isbstutil(treenode *root, int min, int max)

bool isbst(treenode *root)

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

剛開始我想的很簡單,覺得只要遞迴判斷左孩子是否小於根節點 右孩子是否大於根節點就行了 二叉搜尋樹 左孩子 根結點 右孩子 根節點 下面的寫法 錯的!錯的!二叉樹的判斷應該是左子樹的最大值 小於 根節點 右子樹的最小值大於根節點 bool isvalidbst treenode root if roo...

演算法 判斷是否為二叉搜尋樹

輸入 2 14 3 5輸出 true輸入 5 14 3 6輸出 false起初使用堆的方式判定是不對的,二叉搜尋樹的任意結點應該總大於所有左子樹結點以及總小於所有右子樹結點,不能只與左右孩子比較。分析 兩種解法 如果是空樹,則認為是 bst,返回true非空,若 下界 或 上界 則返回false以上...

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

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