(labuladong老師的題目總結)
第乙個問題在bst中尋找乙個數
首先我們普通的尋找就是每個節點都去遍歷然後對比目標值,但是這樣的複雜度是比較高的,而且沒有使用到bst的特點左小右大。那麼應該如何才能使用呢?這裡就要提出乙個bst的框架,我們可以通過每次對比一下target和我們根節點的值,然後選擇左子樹遞迴還是右子樹遞迴,這樣就減少一大半的遍歷時間。
尋找乙個數的**
boolean
isinbst
(treenode root,
int target)
if(root.val>target)
}
bst的簡單框架
void
bst(treenode root,
int target)
if(root.valif(root.val>target)
//接下來我們會發現插入和刪除都是圍繞這乙個框架而修改
}
第二個問題插入乙個數
二叉樹涉及修改的都需要返回乙個節點,用來拼接。插入乙個數也是直接套入框架加入一些修改就可以了。
treenode insertintobst
(treenode root,
int val)
if(root.val>val)
return root;
}
第三個問題就是刪除節點
刪除節點分了三種情況:
①節點沒有左子節點和右子節點
②節點只有乙個子節點
③節點有兩個子節點
①②情況的處理:
if
(root.left==null)
return root.right;
if(root.right==null)
return root.left;
這樣處理可以一下子處理兩種情況,原因是它把子節點直接拼接上去,把原來的節點給過濾掉了,如果是①的話就是把null拼上去了,直接過濾原節點。
③情況的處理:
treenode minnode=
getminnode
(root.right)
;root.val=minnode.val;
root.right=
deletenode
(root.right,minnode.val)
;
首先就是獲取右子樹的最小的節點,然後代替原節點,因為原節點的特點就是比右子節點小,比左子節點大,而原節點的右子樹最小的節點也符合這種特點,所以可以用於替換,然後交換值之後刪除原來的右子樹最小節點就可以了。這裡直接替換了值,然後刪除最小的節點就好了。
完整**
treenode delete
(treenode root,
int target)
else
if(root.valelse
if(root.val>val)
return root;
}treenode getminnode
(treenode node)
完全二叉樹的節點計算
二叉樹的節點計算我們會了,但是如果是完全二叉樹的節點計算也應該按照二叉樹的節點計算來嗎?可以,但是效率不高,我們應該好好使用完全二叉樹的特點,它的特點就是高度差是1,而且一定會有乙個子樹是乙個滿二叉樹,另乙個子樹不是滿二叉樹。根據這個特點我們就能夠優化,通過計算高度之後來計算節點,不是滿二叉樹那邊就普通二叉樹遞迴計算就可以了。
**
public
intcountnodes
(treenode root)
while
(r!=null)
if(hl==hr)
return1+
countnodes
(root.left)
+countnodes
(root.right)
;}
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
滿二叉樹 完全二叉樹 二叉樹的性質
單是每個結點都存在左右子樹不能算是滿二叉樹,還必須要所有的葉子都在同一層上,這就做到了整棵樹的平衡,因此滿二叉樹的特點有 1.葉子只能出現在最下一層,出現在其他層就不可能達成平衡 2.非葉子結點的度一定是2 3.在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子數最多 對一棵具有n結點的二叉樹按層序...