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);
	}
}
Example #2
0
    // 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;
    }
Example #3
0
    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);
    }