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

本文介绍如何将一棵二叉查找树不借助额外节点转换为排序的双向链表。通过递归方法调整节点间的指针连接实现转换,并提供完整的C++实现代码。

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>

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

void change(BSTreeNode** root,BSTreeNode** temp);
void insert(BSTreeNode** root,int n);

int main()
{
	BSTreeNode* root = NULL;
	BSTreeNode* temp = NULL;
	insert(&root,10);
	insert(&root,6);
	insert(&root,14);
	insert(&root,4);
	insert(&root,8);
	insert(&root,12);
	insert(&root,16);

	change(&root,&temp);

	system("pause");
	return 0;
}

void change(BSTreeNode** root,BSTreeNode** temp)
{
	BSTreeNode* current = *root ;
	if (current != NULL)
	{
		BSTreeNode* left = (*root)->m_pLeft ;	//此处要用临时的变量存储左右孩子
		BSTreeNode* right= (*root)->m_pRight ;
		change(&left,temp);
		if (*temp == NULL)
			*temp = *root ;
		else
		{
			(*temp)->m_pRight = *root ;
			(*root)->m_pLeft = *temp ;
			*temp = *root ;
		}			
		change(&right,temp);
	}
}

void insert(BSTreeNode** root,int n)
{
	BSTreeNode* temp = new BSTreeNode;
	BSTreeNode* current ;
	temp->m_nValue = n ;
	temp->m_pLeft = NULL ;
	temp->m_pRight = NULL ;
	if (*root == NULL)
	{
		*root = new BSTreeNode(n);
	}
	else
	{
		current = *root ;
		while(current != NULL)
		{
			if (current->m_nValue>n&¤t->m_pLeft==NULL)
			{
				current->m_pLeft = temp ;
				break;
			}
			else if (current->m_nValue>n&¤t->m_pLeft!=NULL)
			{
				current = current->m_pLeft;
				continue;
			}
			else if (current->m_nValue<n&¤t->m_pRight==NULL)
			{
				current->m_pRight = temp;
				break;
			}
			else if (current->m_nValue<n&¤t->m_pRight!=NULL)
			{
				current = current->m_pRight;
				continue;
			}
		}
	}
}

BSTreeNode::BSTreeNode(int value)
{
	m_nValue = value ;
	m_pLeft = NULL ;
	m_pRight = NULL ;
}

BSTreeNode::BSTreeNode()
{}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值