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

本文详细介绍了如何将二元查找树转换为排序的双向链表,通过递归中序遍历来调整节点指针,实现树形结构到线性结构的高效转换。

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

参考地址为


//* Copyright(C) 2011 
//*
//* FUNCTION : TreeToLink
//* DESCRIPTION : Tree to link
//* PARAMETERS : Type Name Description
//* RETURN : Type Values Description
//* CREATED DATE/BY : 2011/11/30 perfect2011
//*
//* REVISION HISTORY:V1.0

/*
1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
  
    10
   / /
  6  14
/ / / /
4  8 12 16
  
转换成双向链表
4=6=8=10=12=14=16。
*/

#include "stdafx.h"
#include <iostream>
using namespace std;


struct TreeNode
{
    int m_nValue; // value of node
    TreeNode *m_pLeft; // left child of node
    TreeNode *m_pRight; // right child of node
};

typedef TreeNode DoubleList;
DoubleList * pHead;
DoubleList * pListIndex;

//生成查找树
void adjust(TreeNode * & pCurrent, int value)
{
	//根节点的处理,生成根节点,为pCurrent赋值  重点理解:注意为传址,修改了main内的pRoot
	if(NULL == pCurrent)
	{
	TreeNode *pEnd = new TreeNode();
	pEnd ->m_pLeft =NULL;
	pEnd ->m_pRight = NULL;
	pEnd ->m_nValue = value;
	pCurrent = pEnd;
	}
	//
	else
	{   //在左子树添加
		if (value<pCurrent->m_nValue)
		{  
			adjust(pCurrent->m_pLeft,value);
		}
		//在右子树添加
		else if(value>pCurrent->m_nValue)
		{
			adjust(pCurrent->m_pRight,value);
		}
		else
		{
		cout<<" 重 复 的 节 点 "<<endl;
		}
	
	}

}

void addList(TreeNode *pCurrent);
//covert the tree to link
void covertTreeToLink(TreeNode *pCurrent)
{
	//中序读出
	if(pCurrent==NULL)
	{
	return;
	}
	
	//遍历左子树
	if(NULL != pCurrent->m_pLeft)
	{
	covertTreeToLink(pCurrent->m_pLeft);
	}
	
	//将根节点加进链表
	addList(pCurrent);
	
	//遍历右子树
	if(NULL != pCurrent->m_pRight)
    {
		covertTreeToLink(pCurrent->m_pRight);
	}
}
//添加节点到链表
void addList(TreeNode *pCurrent)
{

if(NULL ==pListIndex)
	pHead = pListIndex;
else
{
pCurrent->m_pLeft = pListIndex;
pListIndex ->m_pRight = pCurrent;
pListIndex = pCurrent;//指针后移
}
cout<<"Now "<<pCurrent->m_nValue<<endl;
}

int main()
{   TreeNode * pRoot = NULL;
    pListIndex = NULL;//链表的移动指针
    pHead = NULL;//链表的头指针
	adjust(pRoot, 10);
    adjust(pRoot, 4);
    adjust(pRoot, 6);
    adjust(pRoot, 8);
    adjust(pRoot, 12);
    adjust(pRoot, 14);
    adjust(pRoot, 15);
    adjust(pRoot, 16);
    covertTreeToLink(pRoot);
    getchar();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香菜+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值