题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:题目不能新建新的节点,只能用原有的节点来实现。我们知道对收索二叉树的中序遍历顺序正好是从小到大顺序遍历的,因此我想到先对二叉树进行中序遍历,把节点保存起来,然后在遍历每个节点,使其left指向前一个节点,right指向后一个节点。
程序:
void midiorder(TreeNode *pRootOfTree,vector<TreeNode *> &temp){ //中序遍历;
if(pRootOfTree->left)
midiorder(pRootOfTree->left,temp);
temp.push_back(pRootOfTree);
if(pRootOfTree->right)
midiorder(pRootOfTree->right,temp);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(!pRootOfTree) return NULL;
vector<TreeNode*> temp;
midiorder(pRootOfTree,temp);
int i=0;
temp[0]->left=NULL;
while(i<temp.size()){
if(i+1<temp.size()) temp[i]->right=temp[i+1];
if(i-1>=0) temp[i]->left=temp[i-1];
i++;
}
temp[i-1]->right=NULL;
return temp[0];
}