leetcode第八周解题总结

108. Convert Sorted Array to Binary Search Tree

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

题意解析:
将排序后的数组转换为一棵平衡二叉树

解题思路:
平衡二叉树的子树高度之差小于1,左节点的值小于根节点,右节点的值大于根节点。可以想到,每次取数组的中间值作为根节点即可满足这样的要求。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        int len = nums.size();
        if(len == 0) return NULL;
        if(len == 1) return new TreeNode(nums[0]);
        return sortedArrayToBST(nums, 0, len - 1);
    }
    TreeNode* sortedArrayToBST(vector<int>& nums, int start, int end) {
        if(start > end) return NULL;
        int m = (start + end) /2;
        TreeNode* root = new TreeNode(nums[m]);
        root->left = sortedArrayToBST(nums, start, m - 1);
        root->right = sortedArrayToBST(nums, m + 1, end);
        return root;
    }
};

109. Convert Sorted List to Binary Search Tree

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

题意解析:
将排序后的链表转换为一棵平衡二叉树

解题思路:
与上题的要求一致,但是数组变为链表,不能索引到中间值,如果每次寻找中间节点,则时间复杂度比较大,因此需要改变思路。这里考虑到,链表的排序等于对树进行中序遍历,因此在构建树结构时,先递归右子树,再访问根节点,最后递归左子树,这样就按照链表排序进行赋值,无需更多的操作,时间复杂度O(n)。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        if(head == NULL) return NULL;
        int len = 0;
        lhead = head;
        ListNode* temp = head;
        while(temp != NULL){
            len ++;
            temp = temp->next;
        }
        return sortedListToBST(0, len - 1);

    }
    TreeNode* sortedListToBST(int start, int end) {
        if(start > end) return NULL;
        int mid = (start + end)/2;
        TreeNode* root = new TreeNode(-1);
        root->left = sortedListToBST(start, mid - 1);
        root->val = lhead ->val;
        lhead  = lhead ->next;
        root->right = sortedListToBST(mid + 1, end);
        return root;
    }
private:
    ListNode* lhead;
};

124. Binary Tree Maximum Path Sum

Given a binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.
For example:
Given the below binary tree,

   1
  / \
 2   3

Return 6.

题意解析:
计算一棵树中的最大路径和。

解题思路:
考虑到该路径只需要包括一个节点而且不需要经过根节点的条件,不能简单的进行搜索。首先思考到,对每个子树计算最大路径,然后取最大值。因此,对于每个子树,要计算两个值:一个是通过该子树的根节点的最大路径和,另外一个是通过该子树的根节点的单边路径最大和,这个用于计算上一层的最大路径和。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int ans = INT_MIN;
    int maxPathSum(TreeNode* root) {
        if(root == NULL) return 0;
        findMaxPath(root);
        return ans;
    }
    int findMaxPath(TreeNode* root) {
        if(root == NULL) return 0;
        int rightPath = max(findMaxPath(root->right),0);
        int leftPath = max(findMaxPath(root->left),0);
        ans = max(root->val + rightPath + leftPath, ans);

        return max(max(root->val + rightPath, root->val+ leftPath), root->val);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值