《劍指Offer》-34.二叉樹中和為某一值的路徑

題干

輸入一棵二叉樹和一個整數(shù),打印出二叉樹中節(jié)點值的和為輸入整數(shù)的所有路徑。從樹的根節(jié)點開始往下一直到葉子節(jié)點所經(jīng)過的節(jié)點形成一條路徑。二叉樹節(jié)點的定義如下

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
}

解題思路

使用二叉樹的前序遍歷方式進行遍歷,使用棧記錄每個遍歷到的節(jié)點,并記錄當(dāng)前遍歷當(dāng)節(jié)點當(dāng)累加和,當(dāng)?shù)竭_葉子節(jié)點時,判斷累計和是否等于要求的值,如果是,則打印當(dāng)前棧中的所有元素,如果不等于,則執(zhí)行剛才的逆操作,使用類似流程直到遍歷完所有節(jié)點為止。

代碼實現(xiàn)

<?php

class TreeNode
{
    private $val;
    private $left;
    private $right;

    public function __set($name, $value)
    {
        $this->$name = $value;
    }

    public function __get($name)
    {
        return $this->$name;
    }
}

function getTree()
{
    $node1 = new TreeNode();
    $node1->val = 10;
    $node2 = new TreeNode();
    $node2->val = 5;
    $node3 = new TreeNode();
    $node3->val = 12;
    $node1->left = $node2;
    $node1->right = $node3;
    $node4 = new TreeNode();
    $node4->val = 4;
    $node5 = new TreeNode();
    $node5->val = 7;
    $node2->left = $node4;
    $node2->right = $node5;

    return $node1;
}

function getPath($tree, $target)
{
    if (empty($tree)) {
        return null;
    }

    $stack = [];
    $sum = 0;
    doGetPath($tree, $target, $stack, $sum);
}

function doGetPath($tree, $target, &$stack, &$sum)
{
    $sum += $tree->val;
    array_push($stack, $tree);

    if ($tree->left == null && $tree->right == null) {
        if ($sum == $target) {
            foreach ($stack as $item) {
                echo $item->val.' ';
            }
            echo PHP_EOL;
        }
    }

    if ($tree->left) {
        doGetPath($tree->left, $target, $stack, $sum);
    }
    if ($tree->right) {
        doGetPath($tree->right, $target, $stack, $sum);
    }

    $sum -= $tree->val;
    array_pop($stack);
}

getPath(getTree(), 22);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表,棧,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,762評論 1 31
  • 題目描述: 輸入一顆二叉樹和一個整數(shù),打印出二叉樹中結(jié)點值的和為輸入整數(shù)的所有路徑。路徑定義為從樹的根結(jié)點開始往下...
    夏臻Rock閱讀 233評論 0 0
  • 本系列導(dǎo)航:劍指offer(第二版)java實現(xiàn)導(dǎo)航帖 面試題34:二叉樹中和為某一值的路徑 題目要求:輸入一棵二...
    ryderchan閱讀 1,612評論 0 0
  • 輸入一顆二叉樹和一個整數(shù),打印出二叉樹中結(jié)點值的和為輸入整數(shù)的所有路徑。路徑定義為從樹的根結(jié)點開始往下一直到葉結(jié)點...
    鴻雁長飛光不度閱讀 898評論 0 0
  • 今天最驚喜我的一件事情就是,我在帶祂外出購物時,祂會時不時的問我,媽媽,這個上面的字怎么念?以前是需要我來引導(dǎo)祂注...
    Hisi閱讀 170評論 0 0

友情鏈接更多精彩內(nèi)容