劍指offer刷題總結 樹篇(二)

2021-10-03 06:02:19 字數 3509 閱讀 4724

星級:1

【題目】輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。

【**】

/**

* 輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。

* 路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。

* (注意:在返回值的 list 中,陣列長度大的陣列靠前)

** 思路:

* 儲存所有路徑,並把路徑長度放在首位,然後在進行刪除和排序

* 經過測試,上面這種方式不可行,因為需要遞迴的結果來迴圈找從葉子節點的序列,

* 但是遞迴返回的arraylist是不斷變化的,而arraylist對於變化的序列是不可操作的

* 會丟擲併發修改異常

** 這種不可行的方式是從下往上回溯,需要遍歷葉子節點,在新增根節點

* 那麼,從根節點往葉子節點的上到下的回溯方式,不需要遍歷

** 思路2:

* 可以對target進行操作,每次減去root的val,對target==0以及是否到達葉子節點判斷

** 補充:

* 對於這種返回值的遞迴,需要與跳出條件進行區分,

* 輸入值為空和遞迴的跳出條件,如果不一致,通常需要另起乙個方法

* */

arraylist

> paths =

newarraylist

<

>()

; arraylist

path =

newarraylist

<

>()

;public arraylist

>

findpath

(treenode root,

int target)

/** * 回溯的思想,

* 通過遞迴,把不正確的值還原

* */

public

void

find

(treenode root,

int target,

arraylist

> paths, arraylist

path)

find

(root.left,target,paths,

newarraylist

<

>

(path));

find

(root.right,target,paths,

newarraylist

<

>

(path));

}

【思考】【題目】輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

【**】

public treenode convert

(treenode prootoftree)

if(left == null)

else

}

【思考】注意判斷返回為空的情況,連線左右子樹的時候,需要考慮是否存在左右子樹。

【題目】

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。

【**】

/**

** 輸入一棵二叉樹,求該樹的深度。

* 從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,

* 最長路徑的長度為樹的深度。

* */

public

inttreedepth

(treenode root)

【思考】非遞迴實現:

【題目】

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。

【**】

/**

** 輸入一棵二叉樹,求該樹的深度。

* 從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,

* 最長路徑的長度為樹的深度。

* */

public

inttreedepth

(treenode root)

/** * 平衡二叉樹:

* 1.空樹或者左右子樹高度差不超過1

* 2.左右子樹也是平衡二叉樹

* */

public

boolean

isbalanced_solution

(treenode root)

else

}

【題目】給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。

【**】

/**

* 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。

* 注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。

** 方法1:

* 根據給定的節點,找到該二叉樹的根節點

* 在根據根節點進行中序遍歷,然後獲取下乙個節點

* */

arraylist

path;

public treelinknode getnext

(treelinknode pnode)

path =

newarraylist

<

>()

;findpath

(root)

;int tar,i;

tar = pnode.val;

res = null;

for(i=

0; i

size()

; i++

)break;}

}return res;

}public

void

findpath

(treelinknode root)

findpath

(root.left)

; path.

add(root)

;findpath

(root.right)

;}

【思考】上面的是不需要考慮各種特殊情況的解法

劍指offer刷題心得(面試篇)

行為面試 技術面試 應聘者提問 專案經驗是重中之重,簡歷撰寫參考star模型 即situation 簡短的專案背景 task 完成的任務 action 為完成任務做了哪些工作,怎麼做的 result 自己的貢獻 準確描述對技能的定位 了解,熟悉,精通。回答為什麼跳槽。一定要往積極方面去回答,如個人技...

劍指offer刷題

面試題6 從尾到頭列印鍊錶 struct listnode class solution reverse res.begin res.end return res 替換空格class solution int newnumstr numstr numspace 2 if newnumstr leng...

劍指offer刷題

原題鏈結 動態規劃 class solution dp for int i 1 i len1 i else if p j 1 else return dp len1 len2 原題鏈結 數學推導 找規律 class solution else if n 3 2 return ipow 3 numso...