算是leetcode上两个二叉树问题的综合,我可能在第一步层序建立这颗二叉树都出了问题。。

给定一个值不重复的节点值可为负数的非空二叉树,
1.先找两个指定节点p、q的最近公共祖先x,一个节点也可以是另一个指定节点的祖先。
2.输出上面求出的公共祖先x为根节点的子树从根节点x到所有叶节点的路径。每输出完一个路径换一行。
3.求出第一问以那个公共祖先x为根节点的子树的最大路径和。
下面例子的第一行是输入的,不是定死的。

img

做了好久了,输出就是不对,可能建这颗二叉树都出了问题,求求指点。。

简单帮你写了一下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);
    }