数据结构与算法学习(5)
一.链表的补充(获取两个链表(有环或无环)相交的交点)
ListNode* GetLoopNode(ListNode* head) {
ListNode* fast = head->next->next;
ListNode* slow = head->next;
while (fast != slow)
{
if (fast->next == nullptr || fast->next->next == nullptr)
return nullptr;
fast = fast->next->next;
slow = slow->next;
}
fast = head;
while (fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
ListNode* NoLoop(ListNode* head1, ListNode* head2) {
ListNode* cur1 = head1;
ListNode* cur2 = head2;
int n = 0;
while (cur1->next)
{
n++;
cur1 = cur1->next;
}
while (cur2->next)
{
n--;
cur2 = cur2->next;
}
if (cur1 != cur2)
return nullptr;
cur1 = n > 0 ? head1 : head2;
cur2 = cur1 == head1 ? head2 : head1;
n = abs(n);
while (n > 0)
{
cur1 = cur1->next;
n--;
}
while (cur1 != cur2)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;
}
ListNode* Loop(ListNode* head1, ListNode* loop1, ListNode* head2, ListNode* loop2) {
ListNode* cur1 = nullptr;
ListNode* cur2 = nullptr;
if (loop1 == loop2) {
cur1 = head1;
cur2 = head2;
int n = 0;
while (cur1 != loop1)
{
n++;
cur1 = cur1->next;
}
while (cur2 != loop2)
{
n--;
cur2 = cur2->next;
}
if (cur1 != cur2)
return nullptr;
cur1 = n > 0 ? head1 : head2;
cur2 = cur1 == head1 ? head2 : head1;
while (n > 0)
{
cur1 = cur1->next;
n--;
}
while (cur1 != cur2)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;
}
else {
cur1 = loop1->next;
while (cur1!=loop1)
{
if (cur1 == loop2)
return cur1;
}
return nullptr;
}
}
ListNode* GetIntersectNode(ListNode* head1, ListNode* head2) {
if (head1 == nullptr || head2 == nullptr)return nullptr;
ListNode* loop1 = GetLoopNode(head1);
ListNode* loop2 = GetLoopNode(head2);
if (loop1 == nullptr && loop2 == nullptr) {
NoLoop(head1, head2);
}
if (loop1 != nullptr && loop2 != nullptr) {
Loop(head1, loop1, head2, loop2);
}
return nullptr;
}
二.二叉树
1.二叉树的遍历
- 先序遍历
- 中序遍历
- 后序遍历
改变代码中的顺序即可实现全部遍历方式
vector<int> InorderTraversal(TreeNode* root) {
vector<int> arr;
stack<pair<TreeNode*, int>> s;
s.push(make_pair(root, 0));
while (!s.empty())
{
auto node = s.top();
s.pop();
if (node.first == nullptr)continue;
if (node.second == 0) {
s.push(make_pair(node.first->right, 0));
s.push(make_pair(node.first, 1));
s.push(make_pair(node.first->left, 0));
}
else
arr.emplace_back(node.first->val);
}
return arr;
}
2.二叉树的最大宽度
int TreeWeight(TreeNode* root) {
queue<TreeNode*> q;
unordered_map<TreeNode*, int> hasTable;
q.push(root);
hasTable.insert(make_pair(root, 1));
int maxWeight = INT_MIN;
int curLevel = 1;
int curLevelNodes = 0;
while (!q.empty())
{
TreeNode* node = q.front();
q.pop();
int curNodeLevel = hasTable.at(node);
if (curNodeLevel == curLevel)
curLevelNodes++;
else {
maxWeight = max(maxWeight,curLevelNodes);
curLevel++;
curLevelNodes = 1;
}
if (node->left != nullptr) {
q.push(node->left);
hasTable.insert(make_pair(node->left, curNodeLevel + 1));
}
if (node->right != nullptr) {
q.push(node->right);
hasTable.insert(make_pair(node->right, curNodeLevel + 1));
}
}
return maxWeight;
}