把二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
1.根据算法面试,楼主v_JULY_v给出的答案中函数addBSTreeNode() 并不能构造出如上图所示的二叉树,而是如下图的树:
void addBSTreeNode(BSTreeNode *& pCurrent,int value)
{if (NULL== pCurrent)
{
BSTreeNode* pBSTree=new BSTreeNode();
pBSTree->m_pLeft= NULL;
pBSTree->m_pRight= NULL;
pBSTree->m_nValue= value;
pCurrent= pBSTree;
}
else
{
if ((pCurrent->m_nValue)> value)
{ addBSTreeNode(pCurrent->m_pLeft, value); }
elseif ((pCurrent->m_nValue)< value)
{ addBSTreeNode(pCurrent->m_pRight, value); }
else { //cout<<"重复加入节点"<<endl; }
}
}
10
/ \
4 12
\ \
6 14
\ \
8 16
2, 二叉树适合递归函数的运用,真正构建的二叉树的输入必定为:如果以0结束,则顺序为:10 6 4 0 0 8 0 0 14 12 0 0 16 0 0
代码为:
void CreateBSTree(BSTree**tr)
{
BSTree*p = (BSTree *)malloc(sizeof(node));
scanf("%c",&p->value);
p->left= NULL;
p->right= NULL;
if(p->value != '0')
{
if(!(*tr))
{
*tr = p;
(*tr)->left= NULL;
(*tr)->right= NULL;
}
}
else return;
CreateBSTree(&(*tr)->left);
CreateBSTree(&(*tr)->right);
}
3,楼主在程序中用new分配了内存,但是却没有在程序结束时手动释放分配的内存,造成内存泄露。
4,楼主在程序中声明了全局变量,最好优化去掉。
5,温习知识点:二叉树的升序排序采用中序遍历算法
1.1 前序:根,左子树,右子树
1.2 中序:左子树,根,右子树
1.3 后序:左子树,右子树,根
6, 建立双向链表:
void convertTo2List(BSTree* p, BSTree*& last)
{
if (p == NULL)
return;
convertTo2List(p->m_pleft, last);
if (last != NULL)
last->m_pright = p;
p->m_pleft = last;
last = p;
convertTo2List(p->m_pright, last);
}