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;
}
};