二叉搜索树转化为有序双向链表(C语言)
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct BSTreeNode 5 { 6 int m_nValue; 7 BSTreeNode *m_pLeft; 8 BSTreeNode *m_pRight; 9 }BSTreeNode; 10 11 BSTreeNode *pHead=NULL; 12 BSTreeNode *pIndex=NULL; 13 14 void addBSTreeNode(BSTreeNode* &pCurrent,int value) 15 { 16 if (pCurrent==NULL) 17 { 18 BSTreeNode* pBSTree = NULL; 19 pBSTree = (BSTreeNode*)malloc(sizeof(BSTreeNode)); 20 pBSTree->m_nValue=value; 21 pBSTree->m_pLeft=NULL; 22 pBSTree->m_pRight=NULL; 23 pCurrent=pBSTree; 24 } 25 else if(pCurrent->m_nValue<value) 26 { 27 addBSTreeNode(pCurrent->m_pRight,value); 28 } 29 else if(pCurrent->m_nValue>value) 30 { 31 addBSTreeNode(pCurrent->m_pLeft,value); 32 } 34 } 35 36 void convertToDoubleList(BSTreeNode* pCurrent) 37 { 38 pCurrent->m_pLeft=pIndex;//使当前结点的左指针指向双向链表中最后一个结点 39 if (NULL==pIndex)//若最后一个元素不存在,此时双向链表尚未建立,因此将当前结点设为双向链表头结点 40 { 41 pHead=pCurrent; 42 } 43 else//使双向链表中最后一个结点的右指针指向当前结点 44 { 45 pIndex->m_pRight=pCurrent; 46 } 48 pIndex=pCurrent;//将当前结点设为双向链表中最后一个结点 50 printf("%d ",pCurrent->m_nValue); 52 } 53 54 void inOrderBSTree(BSTreeNode* pBSTree) 55 { 57 if (NULL==pBSTree) 58 { 59 return; 60 } 61 if (NULL!=pBSTree->m_pLeft) 62 { 63 inOrderBSTree(pBSTree->m_pLeft); 64 } 65 66 convertToDoubleList(pBSTree); 67 68 if (NULL!=pBSTree->m_pRight) 69 { 70 inOrderBSTree(pBSTree->m_pRight); 71 } 73 } 74 76 int main() 77 { 79 BSTreeNode *pRoot=NULL; 80 addBSTreeNode(pRoot,10); 81 addBSTreeNode(pRoot,6); 82 addBSTreeNode(pRoot,14); 83 addBSTreeNode(pRoot,4); 84 addBSTreeNode(pRoot,8); 85 addBSTreeNode(pRoot,12); 86 addBSTreeNode(pRoot,16); 87 inOrderBSTree(pRoot); 88 return 0; 89 }