关于把二元查找树变成排序的双向链表算法的理解

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

 题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
    
  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);

      }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值