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

继续上上篇博客,只写了一个二叉树常用方法,上篇中有些不足:
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<<" "; 	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值