129. Sum Root to Leaf Numbers
求所有从根结点到叶子结点路径上结点所组成的数字的和。
简单
int res = 0;
public int sumNumbers(TreeNode root) {
helper(root, 0);
return res;
}
public void helper(TreeNode root, int path) {
if (root == null) return;
path = path * 10 + root.val;
if (root.left == null && root.right == null) {
res += path;
return;
}
helper(root.left, path);
helper(root.right, path);
path /= 10;
}
257. Binary Tree Paths
求所有根结点到叶子结点路径上结点所组成的字符串,字符间用"->"隔开。
也简单,但是注意使用StringBuffer时在递归时作为形参的StringBuffer对象会发生改变,所以这里使用了String:
public List<String> binaryTreePaths(TreeNode root) {
helper(root, "");
return res;
}
List<String> res = new ArrayList<>();
public void helper(TreeNode root, String sb) {
if (root == null) return;
sb += root.val;
if (root.left == null && root.right == null) {
res.add(sb);
return;
}
//如果用StringBuffer,这里连个递归后需要去除sb最后所添加的"->",而且是添加了2次。
helper(root.left, sb + ("->"));
helper(root.right, sb + ("->"));
sb = sb.substring(0, sb.length()-1);
}
236. Lowest Common Ancestor of a Binary Tree
找到一颗二叉树中的最小共同祖先。
有点难度,想法是在遍历到每个结点时判断p和q在该结点的左边还是右边,如果在两边就返回当前结点,否则返回左子树或右子树的根:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q) return root;
TreeNode l = lowestCommonAncestor(root.left, p, q);
TreeNode r = lowestCommonAncestor(root.right, p, q);
if (l != null && r != null)
return root;
else if (l != null) {
return l;
} else
return r;
}
235. Lowest Common Ancestor of a Binary Search Tree
和上题类似,但是树变成了bst,就简单了很多。
上题的解法也可以用,这里用前序遍历,每次判断在左子树还是右子树:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return root;
if ((root.val - p.val) * (root.val - q.val) <= 0) {
return root;
}
if (root.val - p.val > 0)
return lowestCommonAncestor(root.left, p, q);
else
return lowestCommonAncestor(root.right, p, q);
}