面試題:二叉樹中和為某一值的路徑
題目:輸入一顆二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。
從樹的根節點開始往下一直到葉節點所經過的結點形成一條路徑。
參考:
思路:
【方法一(參考中的方法)】
遍歷樹的每一條路,如果路徑的和為指定值,則輸出該路徑,以前序遍歷序列為順序
用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中...