劍指offer第二版 面試題34(java)

2021-09-21 06:47:58 字數 2409 閱讀 6610

面試題:二叉樹中和為某一值的路徑

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

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

參考:

思路:

【方法一(參考中的方法)】

遍歷樹的每一條路,如果路徑的和為指定值,則輸出該路徑,以前序遍歷序列為順序

用pathlist用於儲存總的路徑(多條)

用path儲存當前路徑——遇到滿足條件的路徑,用pathlist.add(new arraylist(path));新增到pathlist中,因為是引用的,如果add(path),則始終指向的是變數path,則在之後對path進行修改,pathlist中的也會修改,並且始終是固定的那個變數

對每個節點,sum-=val,新增節點到路徑中,如果當前節點為葉節點,判斷當前sum=0是否成立,成立則新增當前路徑到pathlist中;如果是葉節點,但是sum=0不成立,則移除當前節點,退回上一步(在findpath中,如果條件不成立且為葉節點,會跳過三個判斷,直接從path中刪除節點,並返回該節點的父節點的findpath中)

【方法二】

(**長度更長一些,但是感覺更好理解吧囧,迴圈的方式解決)

類似先序遍歷的方法

使用乙個棧來儲存路徑中的節點;

使用乙個動態陣列來儲存節點的值,用於在滿足條件時進行輸出;

使用數count來記錄當前路徑之和

先將根節點壓入棧中

進行如下操作,直到棧為空:

1. 如果棧頂元素擁有左節點,則壓入棧中,並在陣列中新增該數,count更新

2. 如果棧頂元素為根節點,則判斷路徑之和是否滿足條件,滿足條件則輸出

3.  判斷路徑之後後,從棧頂跳出節點,進行如下操作:

3.1 如果該節點為其父節點(更新後的棧頂節點)的左節點,則繼續將其父節點的右節點壓入棧中;

3.2 如果該節點為其父節點(更新後的棧頂節點)的右節點,則迴圈判斷,直到所跳出的節點為其父節點的左節點或者棧為空為止

以圖為例,分別舉例說明以上各種情況——在前面已經都遍歷後,用8-10-9到8-10-3為例

1. 壓入8後,壓入10;棧頂元素為10,壓入9;

2. 棧頂元素為9,9為棧頂元素且為葉節點,不能繼續壓入

3. 判斷路徑,為符合的路徑,依次輸出陣列中數字

3.1 9為父節點的左節點,則壓入父節點的右節點,即壓入3

2. 棧頂元素為3,3為棧頂元素且為葉節點,不能繼續壓入

3. 判斷路徑,不為符合的路徑,不輸出

3.2 跳出棧頂元素,3為父節點的右節點,則不壓入,繼續,棧頂元素為10;

3.2 跳出棧頂元素10,是父節點的右節點,則不壓入,繼續,棧頂元素為8

3.2 跳出棧頂元素8,棧為空,終止

// 方法一

public class q34

system.out.println();

} }public static arraylist> getpath(binarytreenode root,int sum)

arraylistpath = new arraylist();

arraylist> pathlist = new arraylist>();

findpath(root,sum,path,pathlist);

return pathlist; }

public static void findpath(binarytreenode root,int sum,arraylistpath,arraylist> pathlist)

if(root.leftnode!=null)

if(root.rightnode!=null)

path.remove(path.size()- 1);

} public static binarytreenode gettree()

}

// 方法二

public static void printpath(binarytreenode root,int n)

// 步驟三

if(count==n)

system.out.println();

}temp = s.pop();

al.remove(al.size()-1);

// 步驟3.1

count = count - temp.val;

if(temp == s.peek().left) else

if(!s.isempty()) }}

}

劍指offer第二版 面試題6(java)

面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...

劍指offer第二版 面試題8 java

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...

劍指offer第二版 面試題9(java)

面試題9 用兩個棧實現佇列 題目描述 方法 兩個棧 stack1 stack2 插入時,直接放入stack1 刪除時,直接彈出pop2中的物件 如果pop2為空,則先將pop1中的物件放入stack2中,再從stack2裡pop第乙個 如 依次放入stack1中1 2 3,在彈出並放入stack2中...