LeetCode刷题日记(Day14)

Problem 105. Construct Binary Tree from Preorder and Inorder Traversal

  • 题目描述
    Given preorder and inorder traversal of a tree, construct the binary tree.

    Note:
    You may assume that duplicates do not exist in the tree.

    For example, given

    preorder = [3,9,20,15,7]
    inorder = [9,3,15,20,7]
    

    Return the following binary tree:

        3
       / \
      9  20
        /  \
       15   7
    
  • 解题思路
    本题的意思是给出二叉树的前序遍历和中序遍历,构造此二叉树。假设 preorder = [3,9,20,15,7],inorder = [9,3,15,20,7],由 preorder 可知此二叉树的根节点为3。

    通过观察可以发现,在 inorder 中,位于元素 3 左边的元素是 3 的左子树节点,位于元素 3 右边的元素是 3 的右子树节点。所以,在确定了根节点、左子树节点和右子树节点之后,可以通过递归的方式构造整颗二叉树。

  • 代码实现

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return helper(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
    }
    TreeNode* helper(vector<int>& preorder, int pL, int pR, vector<int>& inorder, int iL, int iR){
        if(pL > pR || iL > iR)
            return NULL;
        int i;
        for(i = iL; i <= iR; i++)
            if(inorder[i] == preorder[pL])
                break;
        TreeNode* root = new TreeNode(inorder[i]);
        root -> left = helper(preorder, pL+1, pL+i-iL, inorder, iL, i-1);
        root -> right = helper(preorder, pL+i-iL+1, pR, inorder, i+1, iR);
        return root;
    }
};

Problem 141. Linked List Cycle

  • 题目描述
    Given a linked list, determine if it has a cycle in it.

  • 解题思路
    要判断一个链表有没有环,在不申请额外的空间的情况下,最经典的算法就是使用快慢指针。慢指针每次后移一位,快指针每次后移两位。如果有环,则在某个时刻一定有快指针和慢指针所指向的地址相等。

  • 代码实现

class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode * slow = head, *fast = head;
        while(fast != NULL && fast->next != NULL){
            slow = slow->next;
            fast = fast->next->next;
            if(slow == fast)
                return true;
        }
        return false;
    }
};

Problem 206. Reverse Linked List

  • 题目描述
    Reverse a singly linked list.

  • 解题思路
    本题要解决单向链表翻转的问题,较简单,代码如下:

  • 代码实现

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == NULL || head->next == NULL)
            return head;
        ListNode * pre = head;
        ListNode * cur = head->next;
        ListNode * temp = NULL;
        pre -> next = NULL;
        while(cur->next != NULL){
            temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        cur->next = pre;
        return cur;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值