题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。即:即将一棵二叉搜索树转换成双向链表。
解题思路:
- 二叉搜索树是排序的,双向链表前后都有指针。
- 在转换成双向链表时,原先指向左子节点的指针调整为链表中指向前一节点的指针, 原先指向右子节点的指针调整为链表中指向后一节点指针。
- 中序遍历,递归转换
二叉树节点定义:
//二叉树结点定义
struct BinTreeNode{
int m_value;
BinTreeNode *left;
BinTreeNode *right;
};
函数实现:
//辅助函数实现
void ConvertNode(BinTreeNode *pNode, BinTreeNode **pLastNodeInList){
if(pNode == NULL)
return;
//当前结点
BinTreeNode *pCurrent = pNode;
//如果当前结点左子树不为空
if(pCurrent->left != NULL)
ConvertNode(pCurrent->left, pLastNodeInList); //转换左子树
//当前左子树等于转换后的链表尾节点
pCurrent->left = *pLastNodeInList;
//如果尾节点不为空
if(*pLastNodeInList != NULL)
(*pLastNodeInList)->right = pCurrent; //尾节点的左子树指向pCurrent
*pLastNodeInList = pCurrent;
//转换右子树
if(pCurrent->right != NULL)
ConvertNode(pCurrent->right, pLastNodeInList);
}
//主函数
BinTreeNode* Convert(BinTreeNode *pRootOfTree){
//链表中的最后一个节点,将其指向已经转换好的链表的最后一个节点
BinTreeNode *pLastNodeInList = new BinTreeNode;
//辅助函数
ConvertNode(pRootOfTree, &pLastNodeInList);
//pLastNodeInList指向双向链表的尾节点
//需要返回头节点
BinTreeNode *pHeadOfList = pLastNodeInList; //初始赋值为尾节点
//循环找到头节点
while(pHeadOfList != NULL && pHeadOfList->left != NULL)
pHeadOfList = pHeadOfList->left; //最左侧节点即头节点
return pHeadOfList;
}