给定一个值不重复的节点值可为负数的非空二叉树,
1.先找两个指定节点p、q的最近公共祖先x,一个节点也可以是另一个指定节点的祖先。
2.输出上面求出的公共祖先x为根节点的子树从根节点x到所有叶节点的路径。每输出完一个路径换一行。
3.求出第一问以那个公共祖先x为根节点的子树的最大路径和。
下面例子的第一行是输入的,不是定死的。
做了好久了,输出就是不对,可能建这颗二叉树都出了问题,求求指点。。
简单帮你写了一下java版本的,树相关的题还是用递归代码最简洁,话说leetcode上不是有解析吗?
// 第一问 先找两个指定节点p、q的最近公共祖先x,一个节点也可以是另一个指定节点的祖先。
TreeNode gf;
public boolean dfs(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return false;
// 看看当前节点
boolean isCur = root == p || root == q;
// 看看在不在左树
boolean isInLeft = dfs(root.left, p, q);
// 看看在不在右树
boolean isInRight = dfs(root.right, p, q);
/*
* 判断一下几种情况
* 1. 在左树和右树
* 2. 当前节点是p或者q,左树或右树里有另一个节点
* 以上两种情况就说明此时的root节点就是要找的公共祖先
*/
if((isInLeft && isInRight) || (isCur && (isInLeft || isInRight))) gf = root;
// 返回在不在该节点里
return isCur || isInLeft || isInRight;
}
// 第二问 输出上面求出的公共祖先x为根节点的子树从根节点x到所有叶节点的路径。每输出完一个路径换一行。
public void dfs(TreeNode root, List<Integer> res) {
// 这个也很简单,前序遍历即可
if (root == null) return;
res.add(root.val);
// 是叶子节点
if (root.left == null && root.right == null) {
// 你要的输出
System.out.println(res);
return;
}
// 不是叶子节点继续递归
dfs(root.left, new ArrayList<>(res));
dfs(root.right, new ArrayList<>(res));
}
// 第三问 求出第一问以那个公共祖先x为根节点的子树的最大路径和。
int max = Integer.MIN_VALUE;
public void dfs(TreeNode root, int sum) {
/*
* 也是一个前序遍历
* 或者在第二问的时候,直接求出所有的路径的List,然后循环累加判断也是一样的
*/
if (root == null) {
max = Math.max(max, sum);
return;
}
sum += root.val;
dfs(root.left, sum);
dfs(root.right, sum);
}