void TCBinaryObjectTree::balanceNode(TCBinaryObjectTreeNode *&node) { if (node) { TCBinaryObjectTreeNode *middleNode = findMiddleNode(node); if (middleNode != node) { TCBinaryObjectTreeNode *middleNodeParent = findNodeParent(node, middleNode); if (middleNodeParent) { TCBinaryObjectTreeNode *spot = middleNode; if (middleNode == middleNodeParent->left) { while (spot->right) { spot = spot->right; } spot->right = node; node = middleNode; middleNodeParent->left = NULL; } else { } } } balanceNode(node->left); balanceNode(node->right); } }
// O(n)-time, O(1)-space bool isPalindrome2(ListNode *head) { if (head == NULL) { return true; } // 计算中间节点 ListNode *mid = findMiddleNode(head); // 反转后半段链表 ListNode *reverseHead = reverseList(mid->next); // 连接前后两半段链表 mid->next = reverseHead; // 比较前后两个半段链表 // 注意:后半段链表节点个数 <= 前半段链表节点个数 bool isPal = true; while (reverseHead != NULL) { if (head->val != reverseHead->val) { isPal = false; } head = head->next; reverseHead = reverseHead->next; } // 恢复原链表 reverseHead = reverseList(mid->next); mid->next = reverseHead; return isPal; }
void Layer::sortNodes(int first, int size) { Node *pivot; int last = first + size - 1; int middle; int lower = first; int higher = last; if (size <= 1) return; middle = findMiddleNode(first, size); pivot = mNodes[middle]; mNodes[middle] = mNodes[first]; while (lower < higher) { while ((pivot->getPosition().y - pivot->getHeight()) < (mNodes[higher]->getPosition().y - mNodes[higher]->getHeight()) && lower < higher) --higher; if (higher != lower) { mNodes[lower] = mNodes[higher]; ++lower; } while ((pivot->getPosition().y - pivot->getHeight()) > (mNodes[lower]->getPosition().y - mNodes[lower]->getHeight()) && lower < higher) ++lower; if (higher != lower) { mNodes[higher] = mNodes[lower]; --higher; } } mNodes[lower] = pivot; sortNodes(first, lower - first); sortNodes(lower + 1, last - lower); }