面试题(1)——把二叉树变为排序的双向链表

本文介绍如何将一棵二叉查找树转换为排序的双向链表,通过递归方式实现,不创建新节点,仅调整节点间的指针指向。提供完整的C++代码示例,包括树的创建、遍历及转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路参考博客:http://blog.youkuaiyun.com/v_july_v, 表示感谢

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

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

};


个人写的完整代码:


#include <iostream>
using namespace std;

//定义树的结构
typedef struct BSTreeNode
{
	int m_nValue;
	BSTreeNode *m_pleft,*m_pright;
}binTree;

//创建二叉树
void createT(binTree *&rootNode,binTree *tempNode)
{
	if(rootNode==NULL)
	{
		rootNode=tempNode; return;
	}
	else
	{
		if(rootNode->m_nValue > tempNode->m_nValue)
		{
			createT(rootNode->m_pleft,tempNode);
		}
		else if(rootNode->m_nValue < tempNode->m_nValue)
		{
			createT(rootNode->m_pright,tempNode);
		}
	}
}

//先序遍历二叉树
void preOrder(binTree *rootNode)
{
	if(rootNode==NULL)return ;
	else
	{
		cout<<rootNode->m_nValue<<" ";
		preOrder(rootNode->m_pleft);
		preOrder(rootNode->m_pright);
	}
}


void helper(BSTreeNode *&head, BSTreeNode *& tail, BSTreeNode *root)
{
	BSTreeNode *lt, *rh;
	if(NULL == root)
	{
		head=NULL;
		tail=NULL;
		return ;
	}
	helper(head,lt,root->m_pleft);
	helper(rh,tail,root->m_pright);
	if(lt!=NULL)
	{
		lt->m_pright=root;
		root->m_pleft=lt;
	}
	else head=root;
	if(rh!=NULL)
	{
		root->m_pright=rh;
		rh->m_pleft=root;

	}
	else  tail=root;
}

BSTreeNode * treeToLinkerList(BSTreeNode * root)   //递归实现转换
{
	BSTreeNode *head, *tail;
	helper(head,tail,root);
	return head;
}

int main()
{
	binTree *rootNode,*tNode,*head,*p;
	rootNode=NULL; tNode=NULL;
	int ch;
	cin>>ch;
	while(ch!=-1)   //输入-1结束二叉树的创建
	{
		tNode=new binTree;
		tNode->m_nValue=ch; tNode->m_pleft=NULL; tNode->m_pright=NULL;
		createT(rootNode,tNode);
		cin>>ch;
	}
	if(rootNode==NULL)
	{
		 cout<<"Tree is NULL."<<endl;
	}
	else
	{
		cout<<"preOrder: ";      //前序遍历查看创建的二叉树
		preOrder(rootNode); cout<<endl;
	}
	head=treeToLinkerList(rootNode);   //转换成双向链表
	p=head;
	while(NULL != p->m_pright)     //输出双向链表
	{
		cout<<p->m_nValue<<" ";
		p=p->m_pright;
	}
	cout<<p->m_nValue<<endl;     //输出链表的最后一个值
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值