- 1、給定一個(gè)數(shù)組的整數(shù),數(shù)組中的每個(gè)元素都出現(xiàn)了兩次。例外地,有一個(gè)元素只出現(xiàn)了一次。找出那個(gè)只出現(xiàn)了一次的元素。
- 要求:算法的時(shí)間復(fù)雜度應(yīng)是線性的,不需要額外的存儲(chǔ)空間。
-
那么如果其中的元素都出現(xiàn)三次,只有一個(gè)元素出現(xiàn)一次,該如何解決呢?
-
2、如何構(gòu)造一個(gè)二叉樹
-
樹??是n(n>=0)個(gè)節(jié)點(diǎn)的有限集,且這些節(jié)點(diǎn)滿足如下關(guān)系:
- 1:有且僅有一個(gè)節(jié)點(diǎn)沒有父親,該節(jié)點(diǎn)為樹的根,root。
- 2: 除了根外,其余的每個(gè)節(jié)點(diǎn)都有且僅有一個(gè)父節(jié)點(diǎn)。
- 3: 樹中的每個(gè)節(jié)點(diǎn)都構(gòu)成一個(gè)以它為根的樹??。
-
二叉樹在滿足樹的條件時(shí),還滿足如下條件:
- 每個(gè)節(jié)點(diǎn)最多有兩個(gè)孩子,這兩個(gè)子樹有左右之分,次序不可顛倒。
-
- 3、遍歷二叉樹的三種方式
- 前序遍歷:根節(jié)點(diǎn)->左子樹->右子樹
- 中序遍歷:左子樹->根節(jié)點(diǎn)->右子樹
- 后序遍歷:左子樹->右子樹->根節(jié)點(diǎn)
- 4、給定一個(gè)二叉樹與整數(shù) sum,找出所有從根節(jié)點(diǎn)到葉節(jié)點(diǎn)的路徑,這些路徑的節(jié)點(diǎn)值累加之和為sum.
-
思考:
- 使用何種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)遍歷路徑上的節(jié)點(diǎn)。
- 從根節(jié)點(diǎn)深度遍歷二叉樹,先序遍歷時(shí),將該節(jié)點(diǎn)值存儲(chǔ)至path棧中,用Vector實(shí)現(xiàn),使用path_value累加節(jié)點(diǎn)值。
- 使用何種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)遍歷路徑上的節(jié)點(diǎn)。
-
如何判斷一個(gè)節(jié)點(diǎn)為葉子??節(jié)點(diǎn)?當(dāng)遍歷到葉子節(jié)點(diǎn)時(shí)應(yīng)該做什么?
- 當(dāng)遍歷到葉節(jié)點(diǎn)時(shí),檢查path_value值是否為sum,若為sum,則將path push進(jìn)入result 結(jié)果中。
-
在樹的前序 遍歷時(shí)做什么?后序遍歷做什么?
- 后序遍歷時(shí),將該節(jié)點(diǎn)值從path棧中彈出,path_value減去節(jié)點(diǎn)值。
我們遍歷從根節(jié)點(diǎn)到葉子的所有路徑,定義sum為路徑經(jīng)過節(jié)點(diǎn)值之和,若sum等于給定值,我們就輸出該條路徑中的節(jié)點(diǎn)組成的vector。此題中的遞歸跳出條件為訪問完成了葉子節(jié)點(diǎn)。
-
- 5、 已知二叉樹,求二叉樹給定的兩個(gè)節(jié)點(diǎn)的最近公共祖先。
- 最近公共祖先: 兩節(jié)點(diǎn)V與W的最近公共祖先u,滿足在樹上最低,且V, W兩個(gè)節(jié)點(diǎn)都是u的子孫。
- 兩個(gè)節(jié)點(diǎn)的公共祖先一定是從跟節(jié)點(diǎn),到這兩個(gè)節(jié)點(diǎn)的路徑上。
- 由于求公共祖先中的最近公共祖先,那么即同時(shí)出現(xiàn)在這兩條路徑上的離跟節(jié)點(diǎn)最遠(yuǎn)的節(jié)點(diǎn)。
- 最終算法即:求p節(jié)點(diǎn)路徑,q節(jié)點(diǎn)路徑,兩個(gè)路徑上最后一個(gè)相同的節(jié)點(diǎn)。
6、給定一個(gè)二叉樹,求其最大深度。最大深度是從根節(jié)點(diǎn)到最遠(yuǎn)葉節(jié)點(diǎn)的最長(zhǎng)路徑上的節(jié)點(diǎn)數(shù)。
-
思路:
根據(jù)樹的結(jié)構(gòu)特點(diǎn),將其分為左子樹和右子樹兩部分,根據(jù)遞歸先序遍歷的思想將大問題轉(zhuǎn)化為小問題,左右子樹中深度最大的一棵即為該樹結(jié)構(gòu)的深度。