劍指offer第二版-34.二叉樹中和為某一值的路徑

本系列導航:劍指offer(第二版)java實現(xiàn)導航帖

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

題目要求:
輸入一棵二叉樹和一個整數(shù),打印出二叉樹中節(jié)點值的和為輸入整數(shù)的所有路徑罐呼。從樹的根節(jié)點開始往下一直到葉節(jié)點所經(jīng)過的節(jié)點形成一條路徑侦高。

解題思路:
需要得到所有從根節(jié)點到葉節(jié)點的路徑,判斷和是否為給定值。自己寫一個小的二叉樹瞧壮,通過模擬上述過程咆槽,發(fā)現(xiàn)獲取所有路徑的過程與前序遍歷類似秦忿。
因此灯谣,可以對給定二叉樹進行前序遍歷酬屉。當被訪問節(jié)點時葉節(jié)點時揍愁,判斷路徑和是否為給定值。此外朽缎,為了記錄路徑上的節(jié)點话肖,需要一個數(shù)組。

package chapter4;
import structure.TreeNode;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ryder on 2017/7/18.
 * 二叉樹中和為某一值的路徑
 */
public class P182_FindPath {
    //用類似于前序遍歷的思路解決
    public static void findPath(TreeNode<Integer> root,int exceptedSum){
        if(root==null)
            return;
        List<Integer> path = new ArrayList<>();
        findPath(root,path,exceptedSum,0);
    }
    //curNode為將要被訪問的節(jié)點葡幸,還未被加入到path中
    public static void findPath(TreeNode<Integer> curNode,List<Integer> path,int exceptedSum,int currentSum){
        path.add(curNode.val);
        currentSum+=curNode.val;
        if(curNode.left!=null)
            findPath(curNode.left,path,exceptedSum,currentSum);
        if(curNode.right!=null)
            findPath(curNode.right,path,exceptedSum,currentSum);
        if(curNode.left==null && curNode.right==null && currentSum==exceptedSum)
            System.out.println(path);
        path.remove(path.size()-1) ;
    }
   
    public static void main(String[] args) {
        //            10
        //          /   \
        //         5     12
        //       /  \
        //      4    7
        TreeNode<Integer> root = new TreeNode<Integer>(10);
        root.left = new TreeNode<Integer>(5);
        root.right = new TreeNode<Integer>(12);
        root.left.left = new TreeNode<Integer>(4);
        root.left.right = new TreeNode<Integer>(7);
        findPath(root,22);
        findPath2(root,22);
    }
}

如果二叉樹的所有節(jié)點值都是大于0的(原題中并沒有這個條件)最筒,可以進行剪枝。

//如果所有節(jié)點值均大于0蔚叨,可進行剪枝
    public static void findPath2(TreeNode<Integer> root,int exceptedSum){
        if(root==null)
            return;
        List<Integer> path = new ArrayList<>();
        findPath2(root,path,exceptedSum,0);
    }
     //curNode為將要被訪問的節(jié)點床蜘,還未被加入到path中
    public static void findPath2(TreeNode<Integer> curNode,List<Integer> path,int exceptedSum,int currentSum){
        path.add(curNode.val);
        currentSum+=curNode.val;
        //只有當currentSum小于exceptedSum時需要繼續(xù)當前節(jié)點的子節(jié)點的遍歷
        if(currentSum<exceptedSum){
            if(curNode.left!=null)
                findPath2(curNode.left,path,exceptedSum,currentSum);
            if(curNode.right!=null)
                findPath2(curNode.right,path,exceptedSum,currentSum);
        }
        //currentSum大于等于exceptedSum時可以直接停止當前分支的遍歷,因為當前分支下currentSum只會越來越大蔑水,不會再有符合要求的解
        else if(currentSum==exceptedSum && curNode.left==null && curNode.right==null)
            System.out.println(path);
        path.remove(path.size()-1) ;
    }

運行結(jié)果

[10, 5, 7]
[10, 12]
[10, 5, 7]
[10, 12]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邢锯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子搀别,更是在濱河造成了極大的恐慌丹擎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歇父,死亡現(xiàn)場離奇詭異蒂培,居然都是意外死亡,警方通過查閱死者的電腦和手機庶骄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門毁渗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來践磅,“玉大人单刁,你說我怎么就攤上這事「剩” “怎么了羔飞?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長檐春。 經(jīng)常有香客問我逻淌,道長,這世上最難降的妖魔是什么疟暖? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任卡儒,我火速辦了婚禮田柔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骨望。我一直安慰自己硬爆,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布擎鸠。 她就那樣靜靜地躺著缀磕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劣光。 梳的紋絲不亂的頭發(fā)上袜蚕,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音绢涡,去河邊找鬼牲剃。 笑死,一個胖子當著我的面吹牛雄可,可吹牛的內(nèi)容都是我干的颠黎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滞项,長吁一口氣:“原來是場噩夢啊……” “哼狭归!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起文判,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤过椎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戏仓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疚宇,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年赏殃,在試婚紗的時候發(fā)現(xiàn)自己被綠了敷待。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡仁热,死狀恐怖榜揖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抗蠢,我是刑警寧澤举哟,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站迅矛,受9級特大地震影響妨猩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秽褒,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一壶硅、第九天 我趴在偏房一處隱蔽的房頂上張望威兜。 院中可真熱鬧,春花似錦庐椒、人聲如沸牡属。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逮栅。三九已至,卻和暖如春窗宇,著一層夾襖步出監(jiān)牢的瞬間措伐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工军俊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侥加,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓粪躬,卻偏偏與公主長得像担败,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子镰官,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)提前,樹與前面介紹的線性表,棧泳唠,隊列等線性結(jié)構(gòu)不同狈网,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,452評論 1 31
  • 面試題7:重建二叉樹 題目: 輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果。請重建該二叉樹笨腥。假設(shè)輸入的前序遍歷和中序遍歷...
    lyoungzzz閱讀 567評論 0 0
  • 基于樹實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)拓哺,具有兩個核心特征: 邏輯結(jié)構(gòu):數(shù)據(jù)元素之間具有層次關(guān)系; 數(shù)據(jù)運算:操作方法具有Log級的平...
    yhthu閱讀 4,272評論 1 5
  • 二叉樹中和為某一值的路徑 題目描述 輸入一顆二叉樹和一個整數(shù)脖母,打印出二叉樹中結(jié)點值的和為輸入整數(shù)的所有路徑士鸥。路徑定...
    echoVic閱讀 1,611評論 1 3
  • 0. 什么是樹 數(shù)據(jù)的基本單位是數(shù)據(jù)元素,在涉及到數(shù)據(jù)處理時數(shù)據(jù)元素之間的關(guān)系稱之為結(jié)構(gòu)谆级,我們依據(jù)數(shù)據(jù)元素之間關(guān)系...
    安安zoe閱讀 486評論 0 0