您的位置:首页 > 其它

二叉搜索树与双向链表

2015-09-28 15:47 183 查看
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。



方法:中序遍历,当转换到根结点(值为10)时,它的左子树已经转换成一个排序的链表了,并且处在链表中最后一个结点是当前值最大的结点。把值为8的结点和根结点链接起来,此时链表中的最后一个结点就是10了。接着去遍历转换右子树,并把根结点和右子树中最小的结点链接起来。递归转换左子树和右子树。



BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree){
BinaryTreeNode *pLastNodeInList = NULL;
ConvertNode(pRootOfTree, &pLastNodeInList);

// pLastNodeInList指向双向链表的尾结点,我们需要返回头结点
BinaryTreeNode *pHeadOfList = pLastNodeInList;
while (pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL){
pHeadOfList = pHeadOfList->m_pLeft;
}

return pHeadOfList;
}

void ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** pLastNodeInList){
if (pNode == NULL){
return;
}

BinaryTreeNode *pCurrent = pNode;

if (pCurrent->m_pLeft != NULL){
ConvertNode(pCurrent->m_pLeft, pLastNodeInList);
}

pCurrent->m_pLeft = *pLastNodeInList;
if (*pLastNodeInList != NULL){
(*pLastNodeInList)->m_pRight = pCurrent;
}

*pLastNodeInList = pCurrent;

if (pCurrent->m_pRight != NULL){
ConvertNode(pCurrent->m_pRight, pLastNodeInList);
}
}


测试用例

功能测试(输入的二叉树是完全二叉树,所有结点都没有左/右子树的二叉树,只有一个结点的二叉树)

特殊输入测试(指向二叉树根结点的指针为NULL指针)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树