链表的奇偶重排&&二叉树中的最大路径和&&判断二叉树是否对称

112 阅读1分钟

NC133 链表的奇偶重排

题目链接

1、解题思路

采用尾插法,形成两条链表;在结果的时候两个链表连接起来返回就好。

2、代码
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode oddEvenList (ListNode head) {
        // write code here
        ListNode dummyEven = new ListNode(0);
        ListNode dummyOdd = new ListNode(0);

        ListNode tailEven = dummyEven;
        ListNode tailOdd = dummyOdd;
        int cnt = 1;
        while (head != null) {
            ListNode temp = head.next;
            head.next = null;
            if (cnt % 2 == 1) {
                tailOdd.next = head;
                tailOdd = head;
            } else {
                tailEven.next = head;
                tailEven = head;
            }
            head = temp;
            cnt++;
        }
        tailOdd.next = dummyEven.next;
        return dummyOdd.next;
    }
}

NC6 二叉树中的最大路径和

题目链接

1、解题思路

需要计算当前节点的贡献度,以及当前节点可形成路径的最大值。当前节点形成路径的最大值需要和最终的结果进行打擂;当前节点的贡献度合并到其父节点。

2、代码
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    private int ans = Integer.MIN_VALUE;

    private int maxPathSumHelper(TreeNode node) {
        if (node == null) {
            return 0;
        }
        int leftL = Math.max(maxPathSumHelper(node.left), 0);
        int rightL = Math.max(maxPathSumHelper(node.right), 0);
        int tempAns = leftL + rightL + node.val;
        if (tempAns > ans) {
            ans = tempAns;
        }
        return leftL > rightL ? leftL + node.val : rightL + node.val;
    }

    public int maxPathSum(TreeNode root) {
        // write code here
        maxPathSumHelper(root);
        return ans;
    }
}

NC16 判断二叉树是否对称

题目链接

1、解题思路

递归求解,如果节点值不同,直接返回false,否则需要判断左子树和右子树是否对称,注意,需要错开。

2、代码
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return bool布尔型
     */
    private boolean isSymmetricHelper(TreeNode left, TreeNode right) {
        if (left == null && right == null) {
            return true;
        } else if (left != null && right != null) {

            if (left.val != right.val) {
                return false;
            }
            return isSymmetricHelper(left.right, right.left) && isSymmetricHelper(left.left, right.right);
        } else {
            return false;
        }
    }

    public boolean isSymmetric(TreeNode root) {
        // write code here
        if(root == null){
            return true;
        }
        return isSymmetricHelper(root.left, root.right);
    }
}