DFS
求根到叶子节点之和
-
思路:分治法,知道从根节点出发经过左子树的所有路径和从根节点出发经过右子树的所有路径和,把两者加起来即可。
public int sumNumbers(TreeNode root){ if(root == null){ return 0; } return sumNumbersHelper(root,0); } private int sumNumberHelper(TreeNode root, int sum){ int cursum = sum * 10 + root.val; if(root.left == null && root.right == null){ return cursum; } int ans = 0; //从最开始经过当前root在经过左孩子到叶子节点所有路径之和 if(root.left != null){ ans += sumNumBersHelper(root.left, cursum); } if(root.right != null){ ans += sumNumBersHelper(root.right,cursum); } //返回从最开始进过当前root然后到达叶子节点所有路径和。 return ans; }
-
回溯法:一直进行深度遍历,直到得到一个解后,记录当前解。然后再回到之前的状态继续进行深度遍历。
-
首先定义一个函数来得到这个解,回溯的出口就是,当我们到达叶子节点,保存当前累计的路径和。
-
private void dfs(TreeNode root, int cursum){ if(root.left == null && root.right == null){ sum +=cursum; return; } }
-
接着分别取遍历左子树和右子树就可以。把所有的代码和起来。
-
public int sumNumbers(TreeNode root){ if(root == null){ return 0; } dfs(root, root.val); return sum; } int sum = 0; private void dfs(TreeNode root, int cursum){ //到达叶子节点 //尝试左子树 if(root.left != null){ dfs(root.left, cursum * 10 + root.left.val); } //尝试右子树 if(root.right != null){ dfs(root.right, cursum * 10 + root.right.val); } }
-