查詢分為兩種查詢
靜態查詢
動態查詢
二叉查詢樹就是針對動態查詢的一種資料組織的方式
二叉搜尋樹:一棵二叉樹,可以為空;如果不為空,滿足以下性質:
非空左子樹的所有鍵值小於其根結點的鍵值。
非空右子樹的所有鍵值大於其根結點的鍵值。
左、右子樹都是二叉搜尋樹。
bintree insert( elementtype x, bintree bst )
position find( elementtype x, bintree bst )
由於都是尾遞迴,可改寫成迭代版本
position find( elementtype x, bintree bst )
return null;
}
查詢最大和最小元素
最大元素一定是在樹的最右分枝的端結點上
最小元素一定是在樹的最左分枝的端結點上
二叉搜尋樹的插入
〖分析〗
要保證插入該數後依舊還是二叉搜尋樹
關鍵是要找到元素應該插入的位置, 可以採用與find類似的方法
插入時若原樹為空,則生成乙個新的結點的二叉樹
遞迴版:
此處用遞迴有乙個好處,就是無需記錄父節點,當此時的結點為空時就說明此時這個結點就已經是正確的位置了,然後在上一層的遞迴函式中就會把結果賦給父節點的子結點。
bintree insert( elementtype x, bintree bst )
else
return bst;
}
bintree insert( elementtype x, bintree bst )
else
else
}if(flag==1)prenode->right==node;
else if(flag==-1)prenode->left==node;
} return bst;
}
二叉搜尋樹的刪除
一共有三種情況
要刪除的是葉結點:直接刪除,並再修改其父結點指標—置為null
要刪除的結點是只有乙個孩子的結點: 將其父結點的指標指向要刪除結點的孩子結點
要刪除的結點有左、右兩棵子樹: 用另一結點替代被刪除結點:右子樹的最小元素 或者 左子樹的最大元素。為什麼我們要選擇這兩個元素?1:當我們選擇乙個結點來代替被刪除結點時,這個被選擇的結點就會被刪除,所以這個被選擇的結點最好能很簡單的把它刪除掉,而右子樹的最小元素一定是在最左邊,那麼此時這個最小元素的結點一定是沒有孩子結點或者是只有乙個右孩子結點,左子樹的最大元素一定是在最右邊,它一定是沒有孩子結點或者是只有乙個左孩子結點。此時用這兩種元素之一來代替刪除結點就十分方便。可以直接遞迴到第一種或者是第二種情況。2:由於要保證代替被刪除結點後依舊是二叉搜尋樹,所以用這兩種來代替的話,左邊的依舊都小於他,右邊的依舊都大於他。
遞迴:
bintree delete( elementtype x, bintree bst )
else
else if(!bst->left)
free(tmp);}}
} return bst;
}
Codeup二叉查詢樹 二叉搜尋樹
判斷兩序列是否為同一二叉搜尋樹序列 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。接下去的n行有n個序列,每個序列格式跟第乙個序列一樣,請判斷這兩個序列是否能組...
二叉排序樹 二叉搜尋樹 二叉查詢樹
特點 結構體定義struct node 建樹 建二叉排序樹 void create node root,int t else if t root data create root lc,t else create root rc,t 前序遍歷 層序 字典序 int flag int pre 1001...
二叉搜尋樹(二叉排列樹或二叉查詢樹)
1 二叉排序樹性質 1 就是若它的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2 若它的右子樹不空,則右子樹上所有節點的值均大於其根節點的值。3 換句話說就是 任何節點的鍵值一定大於其左子樹中的每乙個節點的鍵值,並小於其右子樹中的每乙個節點的鍵值。2 二叉排序樹查詢 要在二叉樹中找出查詢...