输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 。 4=6=8=10=12=14=16。
声明:思想不是原创。
方法一:其思想是分别转换左右子树成双向链,再通过根节点进行连接
- #include <iostream>
- using namespace std;
- struct BSTree
- {
- int num;
- BSTree* left;
- BSTree* right;
- };
- BSTree *convertToLink(BSTree *tree,bool asRight)
- {
- BSTree *pleft=0;//节点tree的左子树转换成的双向链表
- BSTree *pright=0;//节点tree的右子树转换成的双向链表
- //如果左子树不为空,则先转换左子树
- if(tree->left)
- pleft=convertToLink(tree->left,false);
- //如果双向左链表不为空,将此节点加到末尾
- if(pleft)
- {
- pleft->right=tree;
- tree->left=pleft;
- }
- if(tree->right)
- pright=convertToLink(tree->right,true);
- if(pright)
- {
- pright->left=tree;
- tree->right=pright;
- }
- BSTree *pTemp=tree;
- //如果当前节点tree为其根节点的右子树,则返回此树的最小节点,即为父节点的右子链表的最左节点
- if(asRight)
- {
- while(pTemp->left)
- pTemp=pTemp->left;
- }
- //否则返回最大节点,相当于父节点左子链表的最右节点
- else
- {
- while(pTemp->right)
- pTemp=pTemp->right;
- }
- return pTemp;
- }
- void main()
- {
- BSTree *root;
- BSTree *p4 = new BSTree();
- p4->num=4;
- BSTree *p8 = new BSTree();
- p8->num=8;
- BSTree *p6 = new BSTree();
- p6->num=6;
- p6->left=p4;
- p6->right=p8;
- BSTree *p12 = new BSTree();
- p12->num=12;
- BSTree *p14 = new BSTree();
- p14->num=14;
- p14->left=p12;
- BSTree *p10 = new BSTree();
- p10->num=10;
- p10->left=p6;
- p10->right=p14;
- root = p10;
- root=convertToLink(root,true);
- cout<<root->num<<"=";
- while(root->right){
- root=root->right;
- cout<<root->num<<"=";
- }
- cin.get();
- }
方法二:更容易理解,中序遍历树,那依次访问的节点本身就是有序的,将节点依次加入到链表末尾即可
- #include <iostream>
- using namespace std;
- struct BSTree
- {
- int num;
- BSTree* left;
- BSTree* right;
- };
- /**
- 中序遍历二元查找树,将节点依次加入到双向链表末尾
- **/
- void convertToLink2(BSTree *tree,BSTree *&lastNodeInList)
- {
- if(tree->left)
- convertToLink2(tree->left,lastNodeInList);
- if(lastNodeInList)
- {
- lastNodeInList->right=tree;
- tree->left=lastNodeInList;
- lastNodeInList=tree;
- }
- else
- {
- lastNodeInList=tree;
- }
- if(tree->right)
- convertToLink2(tree->right,lastNodeInList);
- }
- void main()
- {
- BSTree *root;
- BSTree *p4 = new BSTree();
- p4->num=4;
- BSTree *p8 = new BSTree();
- p8->num=8;
- BSTree *p6 = new BSTree();
- p6->num=6;
- p6->left=p4;
- p6->right=p8;
- BSTree *p12 = new BSTree();
- p12->num=12;
- BSTree *p14 = new BSTree();
- p14->num=14;
- p14->left=p12;
- BSTree *p10 = new BSTree();
- p10->num=10;
- p10->left=p6;
- p10->right=p14;
- root = p10;
- //root=convertToLink(root,true);
- //cout<<root->num<<"=";
- //while(root->right){
- // root=root->right;
- // cout<<root->num<<"=";
- //}
- BSTree *doubleLink=NULL;
- convertToLink2(root,doubleLink);
- while(doubleLink->left)
- doubleLink=doubleLink->left;
- cout<<doubleLink->num;
- while(doubleLink->right)
- {
- doubleLink=doubleLink->right;
- cout<<"="<<doubleLink->num;
- }
- cin.get();
- }