題目描述:
輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前)
這個題目沒什麼新穎的,先分析一下再說一下我想到的細節
我先摘抄乙份大神的**,來自
public class solution
}
就是遍歷,看到
findpath(root.left, target);
findpath(root.right, target);
就知道是深度優先,每乙個都路徑都記錄在list
集合裡,當達到要求時就以當前的list集合為標準建立乙個新的list集合新增到listall裡,而返回父節點時把舊的list集合裡最後乙個資料刪除,因為它是當前節點的,下一次用不到它了,就相當於回到父節點轉彎到右節點
這個想法很新穎,這樣所有的葉子節點都可以遍歷到(但也存在浪費的問題),下面分析一下啊
這個題目沒有告訴我們這個二叉樹裡面的值是否為正和為負,所以下面的只是分析一下,不是讓大家照著下面的寫,因為出題人如果有負值人家也沒錯如果此二叉樹只有正值或者是0,沒有負值,那我們是不是可以新增乙個判斷呢?這樣就不用到所有的葉子節點了,就像我知道到這個節點再往下肯定和大於目標值,就不往下走了,回去
下面是
public class main
list.add(root.val);
if(target - root.val>0)
if(target - root.val ==0&&root.left==null&&root.right==null)
list.remove(list.size()-1);
return listall;
}}
因為題意沒給是什麼二叉樹,那我可不可以想法極端一些的,因為深度遍歷,我就讓前面的長度盡可能的大,後面的長度盡可能的小(這個是很有可能的,我也建議大家盡量輸出前排一下序)下面這樣我感覺是最完美的,題意完美契合
public class main else
}};
//返回的listall排序,下面這個和collections.sort(listlist, comparator<> c)是一樣的功能
listall.sort(c);;
return listall;
} public arraylist> findpath1(treenode root,int target)
list.add(root.val);
if(target - root.val ==0&&root.left==null&&root.right==null)
findpath1(root.left, target - root.val);
findpath1(root.right, target - root.val);
list.remove(list.size()-1);
return listall;
}}
劍指offer 二叉樹中和為某乙個值的路徑
題目描述 輸入一顆二叉樹的跟節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。注意 在返回值的list中,陣列長度大的陣列靠前 這種題目我們考慮的就是遞迴的做法 首先建立乙個二維陣列result來儲存滿足條件路徑 建立乙...
劍指offer 二叉樹中和為某乙個值的路徑
題目描述 輸入一顆二叉樹的跟節點和乙個整數expectnumber,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。注意 在返回值的list中,陣列長度大的陣列靠前 思路 此題需要注意的地方是題目所求路徑應該是從根結點開始到葉子結點。...
25 二叉樹中和為某乙個值的路徑 C 版本
使用二叉樹的相關定義及函式在 二叉樹最小結構 c 版本 注意點 找到的是從根節點到葉子節點的所有路徑中滿足條件的。實現 void printdata std vector int paths void findpath binarytreenode proot,std vector int path...