二叉树转化成排序的双向链表
中序(二叉搜索树满足从小到大)遍历树的每一个节点
用pLastNode指向已经转换好的链表的最后的一个节点(值最大的节点)。当遍历到值为10的节点的时候,其左子树已经转换好了,因此pLastNode指向值为8的节点。接着把根结点链接到链表中,值为10的节点成了链表中的最后一个节点(新的值最大的节点)。同理,右子树。
BTreeNode* Convert(BTreeNode* pRoot)
{
BTreeNode* pLastNode = NULL;
ConvertNode(pRoot , &pLastNode);
//pLastNode指向双向链表的尾节点
BTreeNode* pHead = pLastNode;
while (pHead && pHead->pLeft ) //从当前位置找到头结点
{
pHead = pHead->pLeft;
}
return pHead;
}
void ConvertNode(BTreeNode* pNode ,BTreeNode** pLastNode)
{
if (pNode == NULL)
return;
BTreeNode* pCur = pNode;
//树的最左节点作为链表的头
if (pCur->pLeft)
ConvertNode(pCur->pLeft, pLastNode);
pCur->pLeft = pLastNode; //前指针
if (pLastNode)
pLastNode->pRight = pCur;
pLastNode = pCur; //后指针
if (pCur->pRight)
ConvertNode(pCur->pRight, pLastNode);
}
给出两个链表,找出第一个节点
pSListNode GetCrossNode(pSListNode list1, pSListNode list2)//两个不循环的链表找到节点
{
DataType len1 = 0, len2 = 0;
pSListNode cur1 = list1, cur2 = list2;
pSListNode longlist = list1, shortlist = list2;
size_t step = 0;
while (cur1)//求list1长度
{
++len1;
cur1 = cur1->next;
}
while (cur2)//求list2长度
{
++len2;
cur2 = cur2->next;
}
if (len1 < len2)//保证longlist始终为长链表
{
longlist = list2;
shortlist = list1;
}
step = abs(len1 - len2);
while (step--)//对齐,让长链表先走差距步
longlist = longlist->next;
while (longlist != shortlist)
{
longlist = longlist->next;
shortlist = shortlist->next;
}
return longlist;
}