二叉搜尋樹

2021-09-26 14:54:31 字數 2012 閱讀 2922

二叉搜尋樹 bst

非空左子樹的所有鍵值均小於其根節點的鍵值

非空右子樹的所有鍵值均大於其根節點的鍵值

左右子樹均為二叉搜尋樹

最小元素一定在最右子樹;最大元素一定在最左子樹

二叉搜尋樹操作的特別函式

position find(elementtype x,bintree bst)

position findmin(bintree bst)

position findmax(bintree bst)

position insert(elementtype x,bintree bst)

position delete(elementtype x,bintree bst)

二叉搜尋樹操作函式的定義

**如下:

// 二叉樹查詢的尾遞迴

position find

(elementtype x

,bintree bst

)//二叉樹查詢的迭代查詢

position iterfind

(elementtype x

,bintree bst

)return

null

;//查詢失敗

}/*查詢最小元素*/

position findmin

(bintree bst

)/*查詢最大元素*/

position findmax

(bintree bst

)/*插入*/

bintree insert

(elementtype x

,bintree bst

)else

//開始找到要插入的節點

//如果元素x已存在,則什麼都不做

return

bst;

}/*刪除*/

bintree delete

(elementtype x

,bintree bst

)else

return

bst;

}

兩個序列是否對應相同搜尋樹的判別

給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可由多種不同的插入序列得到。例如序列 和插入初始為空的二叉搜尋樹,都能的到同樣的結果。問題:對於輸入的各種插入序列,你需要判斷它們是否能夠生成一樣的二叉搜尋樹?

**如下:

/*搜尋樹的表示*/

typedef struct treenode*tree;

struct treenode

/*建立樹的結點*/

tree newnode

(int v

)//node,結點

/*樹結點的插入*/

tree insert

(tree t

,int v

)returnt;

}/*建立樹:輸入資料,將它加在樹上*/

tree maketree

(int n

)returnt;

}/*判別函式*/

int judge

(tree t

,int n)if

(flag)

return0;

else

return;}

/*結點標記的清除*/

void

resett

(tree t

)//清除t的各結點的flag標記

/*釋放t的空間*/

void

freetree

(tree t

)/*主函式*/

int main()

freetree(t

);//釋放結點空間

scanf

("%d",&

n);}

return0;

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...