算法习题2:将二叉树转换成双向链表

来源:互联网 发布:淘宝网怎么解绑手机号 编辑:程序博客网 时间:2024/06/09 19:25
继续上上篇博客,只写了一个二叉树常用方法,上篇中有些不足:
1、添加新节点 那段代码可以独立出来,用递归方式写成
void insertNode(BSTree* &p, int value)
{
if(p == NULL){
p = new BSTree();
p->value = value;
p->bsLeft = NULL;
p->bsRight = NULL;
return;
}
if(value < p->value)
insertNode(p->bsLeft, value);
else if(value >= p->value)
insertNode(p->bsRight, value);
}

2、查找也同上进行更改,递归调用自身

------------------------------------------------
这里引入一个新问题
1.把二元查找树转变成排序的双向链表
 题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
    
   10
   \
   14
 \
 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
};
*/

这里考虑下,我们遍历的时候是按顺序输出,那我们是有办法得到这个顺序链表的,所以只要对遍历函数稍加改变即可
这里引入两个共有变量
BSTree* cur = NULL; BSTree*dchain_head = NULL;
加入下面着两个函数,主要的是第二个
void printDoubleChain(); voidch(BSTree*);

实现如下:
void ch(BSTree* p) { if(p==NULL){return; } ch(p->bsLeft); //这里把打印变成记录我们当前双向链表记录的指针,只要控制让他们形成链表关系就可以了if(cur == NULL){ cur = p;dchain_head = cur; }else{ cur->bsRight = p; p->bsLeft = cur;cur = p; } // ch(p->bsRight); }



打印如下
void printDoubleChain() { cur =dchain_head; cout<<"from left to right"<<endl;while(cur->bsRight!=NULL){ cout<<cur->value<<" ";cur = cur->bsRight; } cout<<cur->value<<" ";//这里不想让cur跑到结尾空出,所以尾巴单独打印 //下面重新逆向循环 cout<<"from right toleft"<<endl; while(cur->bsLeft!=NULL){cout<<cur->value<<" "; cur = cur->bsLeft; }cout<<cur->value<<" "; }



原创粉丝点击