1.二分木のすべてのパス
一時変数を使用した深さ優先トラバーサル(DFS)(StringBuilderもここで使用できますが、Stringは不変オブジェクトであり、+ =操作は複数のStringオブジェクトを作成し、効率に影響します)、ノードが左右のサブツリーが両方ともnullでない場合は、再帰的に呼び出します。ノードの左右のサブツリーが両方ともnullの場合は、リーフノードに再帰的に戻り、一時変数の値を保存します。LeetCodeリンク
public class LeetCode257 {
public static List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<>();
if (root == null) return res;
helper(root, new StringBuilder(), res);
return res;
}
private static void helper(TreeNode node, StringBuilder sb, List<String> res) {
sb.append(node.val);
if (node.left != null || node.right != null) {
sb.append("->");
if (node.left != null) {
helper(node.left, new StringBuilder(sb), res);
}
if (node.right != null) {
helper(node.right, new StringBuilder(sb), res);
}
}
if (node.left == null && node.right == null)
res.add(sb.toString());
}
public static void main(String[] args) {
TreeNode node = new TreeNode(1);
node.left = new TreeNode(2);
node.left.right = new TreeNode(5);
node.right = new TreeNode(3);
System.out.println(binaryTreePaths(node));
}
}
2.パスの合計
例を参照してください1. 二叉树的所有路径
。DFSトラバーサルを介してバイナリツリーのすべてのパスを取得できます。フラグを使用して対応するブランチが見つかったかどうかを記録し、変数totalを使用して各ノードのval値を累積します。リーフノードをトラバースするときに、合計が指定された合計に等しいかどうかを判断します。等しい場合は、フラグを設定します。真になり、再帰を早期に終了します。LeetCodeリンク
public class LeetCode112 {
private static boolean flag = false;
public static boolean hasPathSum(TreeNode root, int sum) {
if (root == null) return flag;
helper(root, sum, 0);
return flag;
}
private static void helper(TreeNode node, final int sum, int tmp) {
if (node == null || flag) return;
tmp += node.val;
if (node.left != null)
helper(node.left, sum, tmp);
if (node.right != null)
helper(node.right, sum, tmp);
if (node.left == null && node.right == null && tmp == sum) {
flag = true;
}
}
public static void main(String[] args) {
TreeNode node = new TreeNode(8);
node.left = new TreeNode(9);
node.right = new TreeNode(-6);
node.right.left = new TreeNode(5);
node.right.right = new TreeNode(9);
System.out.println(hasPathSum(node, 7));
}
}
3.パスの合計(2)
指定された値に等しいパスとすべてのパスを取得します。バインドする1. 二叉树的所有路径
と2. 路径总和
、DFSを介してすべてのパスを取得できます。一時変数によって計算され、現在のパスの合計値の合計に等しくなります。もう1つの操作は、List変数を使用してノードの現在の値を保存することです。LeetCodeリンク
public class LeetCode113 {
public static List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> res = new ArrayList<>();
helper(root, sum, 0, res, new ArrayList<>());
return res;
}
private static void helper(TreeNode node, int sum, int total, List<List<Integer>> res, List<Integer> tmpList) {
if (node == null) return;
total += node.val;
tmpList.add(node.val);
if (node.left != null)
helper(node.left, sum, total, res, new ArrayList<>(tmpList));
if (node.right != null)
helper(node.right, sum, total, res, new ArrayList<>(tmpList));
if (node.left == null && node.right==null && total == sum)
res.add(tmpList);
}
public static void main(String[] args) {
TreeNode node = new TreeNode(8);
node.left = new TreeNode(1);
node.right = new TreeNode(-3);
node.right.left = new TreeNode(4);
node.right.right = new TreeNode(3);
System.out.println(pathSum(node, 9));
}
}