二叉搜尋樹

2021-10-07 18:23:21 字數 1883 閱讀 1621

二叉搜尋樹就是左子樹所有結點都小於根結點,右子樹所有結點都打於根節點。當然這個定義遞迴的,它的左右子樹也滿足這個特點

例如:

typedef

int bstdatatype;

//定義二叉搜尋樹結點型別

typedef

struct bstreenode

bstreenode

思路:遇到插入結點這種題目,就大致分為兩個步驟。

//建立乙個新的二叉搜尋樹結點

bstreenode*

buybstreenode

(bstdatatype x)

else

return ret;

}//插入結點

intbstreeinsert

(bstreenode*

* root, bstdatatype x)

else

//二叉搜尋樹中有結點

else

if(cur-

>_data < x)

else

}//parent為插入結點的母親,比較確定插入位置在左還是右最後插入

if(parent-

>_data > x)

else

}}

//查詢乙個結點

//根據二叉搜尋樹的特點,左樹都小於根節點,右樹都大於根節點的特點和已知值相比遍歷二叉搜尋樹來查詢

//這裡直接給一級指標也可以,為了和上邊操作統一才弄得二級指標

bstreenode*

bstreefind

(bstreenode*

* root, bstdatatype x)

//x小於當前結點,必然在左樹

else

if(cur-

>_data>x)

else

}//遍歷結束則沒有找到,返回null

return null;

}

思路:遞迴遍歷,先遞迴遍歷左子樹,在訪問根結點,最後遞迴遍歷右子樹。

//中序遍歷二叉搜尋樹(遞迴)

void

bstreeinorder

(bstreenode*

* root)

//遞迴遍歷左子樹

bstreeinorder(&

(*root)

->_left)

;//訪問根結點

printf

("%d ",(

*root)

->_data)

;//遞迴遍歷右子樹

bstreeinorder(&

(*root)

->_right)

;}

思路:二叉搜尋樹中序遍歷的結果是遞增序列。中序遍歷的逆序的第k個元素就是本題的解。

中序遍歷的逆序遍歷方法:

每個節點都先訪問右子樹,再訪問左子樹。

按這種方法,最先訪問的一定是第1大的節點。

第k個訪問的一定是第k大的節點。

因此,每訪問乙個節點,k減一。

當k==1時,就是第k大的節點。

當k<=0時,就不再訪問節點及其子樹。

class

solution

void

dfs(treenode* root,

int k)

};

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...