剑指 Offer 34. 二叉树中和为某一值的路径【附完整可运行代码】
生活随笔
收集整理的這篇文章主要介紹了
剑指 Offer 34. 二叉树中和为某一值的路径【附完整可运行代码】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
立志用最少的代碼做最高效的表達
輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。
示例:
給定如下二叉樹,以及目標和 target = 22,
返回:
[
[5,4,11,2],
[5,8,4,5]
]
提示:
節點總數 <= 10000
解法:dfs
邊界條件:當某節點是葉子結點,并且當前和等于target。
注意:
1、將容器設為成員變量,而不是把當做參數傳遞,后者效率很低。
2、對樹的dfs中,無需設立vis數組,因為樹是具有規律性的,只會從上到下,從左到右的搜索。
3、dfs剪枝時的語句:if(nowValue > Value) return; 不適用于節點值可能為負的情況。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/ class Solution {// 定義成員變量List<List<Integer>>list;int sum, tar;List<Integer>tmp;public List<List<Integer>> pathSum(TreeNode root, int target) {// 為成員變量賦值sum = 0; tar = target;tmp = new ArrayList<>();list = new ArrayList<>();if(root == null) return list; // 魯棒性tmp.add(root.val); // 先加入根節點dfs(root.val, root); // 先不加vis試一下return list;}public void dfs(int nowSum, TreeNode nowRoot) {// if(nowSum > tar) return; // 剪枝 這個剪枝,只能用在節點是正的情況下// 遍歷到了葉節點,且等于目標值,則該路徑符合if((nowRoot.left==null && nowRoot.right == null) && nowSum == tar) {list.add(new ArrayList<>(tmp));return;}if(nowRoot.left != null) {tmp.add(nowRoot.left.val); // System.out.println(tmp.toString());dfs(nowSum + nowRoot.left.val, nowRoot.left);tmp.remove(tmp.size()-1);}if(nowRoot.right != null) {tmp.add(nowRoot.right.val); // System.out.println(tmp.toString());dfs(nowSum + nowRoot.right.val, nowRoot.right);tmp.remove(tmp.size()-1);}} }
完整可運行代碼
import java.util.ArrayList; import java.util.LinkedList; import java.util.List;public class 劍指Offer34_二叉樹中和為某一值的路徑 {static class TreeNode {int val;TreeNode left, right;TreeNode(int v) { val = v; }}static class Solution {// 定義成員變量List<List<Integer>>list;int sum, tar;List<Integer>tmp;public List<List<Integer>> pathSum(TreeNode root, int target) {// 為成員變量賦值sum = 0; tar = target;tmp = new ArrayList<>();list = new ArrayList<>();if(root == null || target == 0) return list; // 魯棒性tmp.add(root.val); // 先加入根節點dfs(root.val, root); // 先不加vis試一下return list;}public void dfs(int nowSum, TreeNode nowRoot) {if(nowSum > tar) return; // 剪枝// 遍歷到了葉節點,且等于目標值,則該路徑符合if((nowRoot.left==null && nowRoot.right == null) && nowSum == tar) {list.add(new ArrayList<>(tmp));return;}if(nowRoot.left != null) {tmp.add(nowRoot.left.val); // System.out.println(tmp.toString());dfs(nowSum + nowRoot.left.val, nowRoot.left);tmp.remove(tmp.size()-1);}if(nowRoot.right != null) {tmp.add(nowRoot.right.val); // System.out.println(tmp.toString());dfs(nowSum + nowRoot.right.val, nowRoot.right);tmp.remove(tmp.size()-1);}}}public static void main(String[] args) {// [10, 5, 12, 4, 7, null, null]TreeNode treeNode = new TreeNode(10);TreeNode tmp21 = new TreeNode(5), tmp22 = new TreeNode(12);TreeNode tmp31 = new TreeNode(4), tmp32 = new TreeNode(7);treeNode.left = tmp21; treeNode.right = tmp22;tmp21.left = tmp31; tmp21.right = tmp32;Solution solution = new Solution();List<List<Integer>> list = solution.pathSum(treeNode, 22);// toString打印數組中的值System.out.println(list.toString());} }總結
以上是生活随笔為你收集整理的剑指 Offer 34. 二叉树中和为某一值的路径【附完整可运行代码】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【超100%解法】剑指 Offer 33
- 下一篇: 【三次优化】剑指 Offer 35. 复