您的位置:首页 > 其它

1.把二元查找树转变成排序的双向链表(树)

2012-02-25 17:14 351 查看
1.把二元查找树转变成排序的双向链表(树)

题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

要求不能创建任何新的结点,只调整指针的指向。

10

/ /

6 14

/ / / /

4 8 12 16

转换成双向链表

4=6=8=10=12=14=16。

首先我们定义的二元查找树 节点的数据结构如下:

struct BSTreeNode

{

int m_nValue; // value of node

BSTreeNode *m_pLeft; // left child of node

BSTreeNode *m_pRight; // right child of node

};

//coder:Lee

//note:一、条件,判断是否为空,二、首节点特殊处理,三、该添加&就添加,应用不分配内存

#include<iostream>

using namespace std;

struct BSTreeNode

{

BSTreeNode* m_pLeft;

BSTreeNode* m_pRight;

int m_nValue;

};

void InitBSTree(BSTreeNode *& root)

{

int i;

cin>>i;

if (i!=0)

{

root=new BSTreeNode();

root->m_nValue=i;

InitBSTree(root->m_pLeft);

InitBSTree(root->m_pRight);

}

else

{

root=NULL;

}

return;

}

void PreTraverse(BSTreeNode* root)

{

if(!root)

return;

else

{

cout<<root->m_nValue<<" ";

PreTraverse(root->m_pLeft);

PreTraverse(root->m_pRight);

}

}

const LEFT=1;

const RIGHT=2;

BSTreeNode* BSTreeToLink(BSTreeNode* root,int Direct)

{

if (!root)

{

return NULL;

}

BSTreeNode* PreNode=BSTreeToLink(root->m_pLeft,RIGHT);//取左子树的最大节点

BSTreeNode* NextNode=BSTreeToLink(root->m_pRight,LEFT);//取右子树的最小节点

//将三个节点相连,如果其他两个非空的话

if (PreNode)

PreNode->m_pRight=root;

root->m_pLeft=PreNode;

root->m_pRight=NextNode;

if (NextNode)

NextNode->m_pLeft=root;

if (Direct==LEFT)//定位最小的

while (root->m_pLeft!=NULL)

root=root->m_pLeft;

if (Direct==RIGHT) //定位最大的

while (root->m_pRight!=NULL)

root=root->m_pRight;

return root;

}

int IsFirstArrive=1;

BSTreeNode* pHead,*pLast;

void NewBSTreeToLink(BSTreeNode* root)//通过中序遍历

{

if (!root)

return;

if(root->m_pLeft!=NULL)

NewBSTreeToLink(root->m_pLeft) ;

else

{

if(IsFirstArrive==1)//找到首节点

{

cout<<"FirstArriver"<<endl;

pHead=root;

pLast=root;

IsFirstArrive=0;

}

}

if (root!=pHead)//非首节点,则将本节点与上一节点相连

{

root->m_pLeft=pLast;

pLast->m_pRight=root;

pLast=root;

cout<<"value:"<<root->m_nValue<<endl;

}

if(root->m_pRight!=NULL)

NewBSTreeToLink(root->m_pRight);

else

return;

}

int main()

{

BSTreeNode *root;

InitBSTree(root);//叶子节点输入0

PreTraverse(root);

cout<<endl;

/* BSTreeNode *head=BSTreeToLink(root,LEFT);//方法一

while (head)

{

cout<<head->m_nValue<<endl;

head=head->m_pRight;

}

*/

NewBSTreeToLink(root);//方法二

while (pHead->m_pRight!=NULL)//定位到链表尾,

pHead=pHead->m_pRight;

while(pHead)//逆向输出

{

cout<<pHead->m_nValue<<endl;

pHead=pHead->m_pLeft;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: