每天一道算法题(8)——把二元查找树转变成排序的双向链表


       题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。比如将二元查找树

10
/ \
6 14
/ \ / \
  4 81216
      转换成双向链表4=6=8=10=12=14=16


1.思路

       使用递归法。注意由于需要改变指针的指向,因此使用了指针引用。


2.代码

#include"iostream"
using namespace std;
struct Node // a node in the binary search tree
{
  int value; // value of node
  Node* left; // left child of node
  Node* right; // right child of node
};

bool createList(Node* Head,Node* &left,Node* &right){
      
	  left=Head;
	  right=Head;
	  
      if(!Head)
	        return false;
	  else{
	   Node*l1,*r1,*l2,*r2;
	   l1=NULL;
	   r1=NULL;
	   l2=NULL;
	   r2=NULL;
	   if(createList(Head->left,l1,r1)){
		   	Head->left=r1;
			r1->right=Head;
			left=l1;
	   }
	   if(createList(Head->right,l2,r2)){
		   	Head->right=l2;
			l2->left=Head;
			right=r2;
	   }
	  return true;
	}
}

void main(){
	Node n4={4,NULL,NULL};
	Node n5={8,NULL,NULL};
	Node n6={18,NULL,NULL};
	Node n2={6,&n4,&n5};
	Node n3={14,NULL,&n6};
	Node n1={10,&n2,&n3};

	Node*Left=NULL;
	Node*Right=NULL;

	createList(&n1,Left,Right);
	while(Left){
		cout<<Left->value<<endl;
		Left=Left->right;
	}
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值