二叉搜尋樹就是左子樹所有結點都小於根結點,右子樹所有結點都打於根節點。當然這個定義遞迴的,它的左右子樹也滿足這個特點
例如:
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 解釋 輸入為 ...