演算法題 路徑總和

2021-10-07 20:54:42 字數 1666 閱讀 3940

題目描述:給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。

說明: 葉子節點是指沒有子節點的節點。

示例: 

給定如下二叉樹,以及目標和 sum = 22,

5/ \

4 8

/ / \

11 13 4

/ \ \

7 2 1

返回 true, 因為存在目標和為 22 的根節點到葉子節點的路徑 5->4->11->2。

解法一

使用遞迴的方法,每訪問過乙個節點,就把它的值從sum中減去,作為新的sum。

時間複雜度:o(n)。空間複雜度:o(h),h為樹的深度。

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

//判斷此節點是否為葉子結點,如果是,就判斷它的值與此時的sum是否相等

if(root.left==null && root.right==null)

//如果不是葉子結點,就繼續去它的左子樹或右子樹尋找,並將sum減去當前節點的值作為新的sum。

return

haspathsum

(root.left,sum-root.val)

||haspathsum

(root.right,sum-root.val);}

}

解法二

使用佇列儲存結點,實現廣度優先遍歷,並使用另乙個佇列儲存對應的路徑總和。

時間複雜度:o(n)。空間複雜度:o(n),空間複雜度主要取決於佇列的開銷,佇列中的元素個數最多是樹的節點數。

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

//定義乙個佇列存放節點

queue

quenode =

newlinkedlist

<

>()

;//定義乙個節點存放當前節點到root路徑上的節點值的和

queue

queval =

newlinkedlist

<

>()

;//將根結點和其值分別如對應的佇列

quenode.

offer

(root)

; queval.

offer

(root.val)

;//當佇列不為空時,說明還有節點沒有遍歷

while

(!quenode.

isempty()

)}//如果當前節點有左孩子,將左孩子入佇列,並將curs加上它左孩子的值放入佇列

if(curnode.left!=null)

//如果當前節點有右孩子,將右孩子入佇列,並將curs加上它右孩子的值放入佇列

if(curnode.right!=null)

}return

false;}

}

演算法 路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。從根節點開始,使用遞迴,判斷左節點或者右節點到葉子節點是否存在sum root.val即可。class solution 到達葉子節點時,遞迴終止,判斷 su...

2021 2 7 刷題(路徑總和)

題目描述 給你二叉樹的根節點 root 和乙個表示目標和的整數 targetsum 判斷該樹中是否存在 根節點到葉子節點 的路徑,這條路徑上所有節點值相加等於目標和 targetsum 葉子節點 是指沒有子節點的節點。題解 採用dfs遍歷路徑,使用遞迴方式。遞迴函式的引數和返回值的確定 如果需要搜尋...

每日一題 路徑總和

題目描述 給定乙個二叉樹和乙個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,返回 5,4,11,2 5,8,4,5 思路dfs 前序遍歷 遞迴 用乙個path來存放路徑,每次將當前節點值新增到路徑中...