題目描述:給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和 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來存放路徑,每次將當前節點值新增到路徑中...