二叉查找树 转 双链表

《二叉查找树 转 双链表》

题目的要求如上图所示

测试用例(先构造二叉查找树)

void buildBSTreeNode(BSTreeNode* head,int data){
node = (BSTreeNode*)malloc(sizeof(BSTreeNode));
node->data = data;
node->m_Left = NULL;
node->m_Right = NULL;
BSTreeNode* p = head;
while(p){
if(node->data > p->data){
if(!p->m_Right){
p->m_Right = node;
return ;
}
p = p->m_Right;
else
if(node->data < p->data){
if(!p->m_Left){
p->m_Left = node;
return ;
}
p = p->m_Left;
}
else
{
printf("已存在\n");
return ;
}
}
}
int main(){
BSTreeNode* head = (BSTreeNode*)malloc(sizeof(BSTreeNode));
head->m_Left = NULL;
head->m_Right = NULL;
int data;
printf("Enter data(end with 0)\n");
scanf("%d",&data);
head->data = data;
while(data){
   printf("Enter data(end with 0)\n");
   scanf("%d",&data);
   if(!data)
       break;
   buildBSTree(head, data);
}
}

释放内存:

void freeBSTree(BSTreeNode* head){
if(head->m_Left)
  freeBSTree(head->m_Left);
if(head->m_Right)
  freeBSTree(head->m_Right)
free(head);
}   

 

自己也想不出好的方法,只能是参考别人的

节点:

struct BSTreeNode{
int data;
BSTreeNode* m_Left;
BSTreeNode* m_Right;
};

节点转换:(方法一)
(采用递归的方法,将左子树和右子树以此转化为链表)

BSTreeNode* ConvertNode(BSTreeNode * node, bool isLeft){
//如果是左子树,则返回最大节点;否则,返回最小节点
if(!node)
return NULL;
BSTreeNode* Left = NULL;
BSTreeNode* Right = NULL;
if(BSTreeNode->m_Left)
   Left = ConvertNode(BSTreeNode->m_Left,true);
if(Left)
  Left->m_Right = node;
node->m_Left = Left;
if(BSTreeNode->m_Right)
  Right = ConvertNode(BSTreeNode->m_Right,false);
if(Right)
  Right->m_Left = node;
node->m_Right = Right;
BSTreeNode* temp = node;
if(isLeft)
  while(temp->m_Right)
     temp = temp->m_Right;
else
  while(temp->m_Left)
     temp =temp->m_Left;
return temp;
}
      

主函数:

#include<stdio.h>
int main(){
head = ConvertNode(head,false);
//假设head为二叉查找树,则返回的就是最小的节点,再遍历head即可
return 0;
}

节点转换(方法二)
采用中序遍历二叉树

void ConvertNode2(BSTreeNode* node, BSTreeNode*& lastOfList){
BSTreeNode* currentNode = node;
if(!node)
  return ;
if(node->m_Left)
  ConvertNode2(node->m_Left, lastOfList);
if(lastOfList)
  lastOfList->m_Right = currentNode;
currentNode->m_Left = lastOfList;
lastOfList = currentNode;
if(node->m_Right)
  ConvertNode2(node->m_Right,lastOfList);
}

主函数:

int main(){
BSTreeNode* lastOfList = NULL;
ConvertNode2(head,lastOfList);
//使指针移到首节点
while(head->m_Left)
  head = head->m_Left;
return 0;
}

 

    原文作者:idealing
    原文地址: https://www.cnblogs.com/idealing/p/3390237.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞