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

描述:输入一颗二元查找树,将二元查找树转换成一个排序的双向链表。要求不能创建人新创建的结点,只调整指针的指向。


我的思路:利用递归思想进行解答。

1.分解,将结点P分解成左子树和右自树两个部分。

2.解决子问题,左子树变成一个双向链表,右子树变成一个双向链表。

3.合并,将结点P的left 连接到左子树中最大的结点,将结点p的rignt连接到右子树中最小的结点。


最后,将root指向最小结点。


代码如下:

template <class T>
	struct Node{
		Node<T>* left;
		Node<T>* right;
		T ele;
	};

	template <class T>
	class BTree{
	public:
		BTree(){

		}
		virtual ~BTree(){

		}

		Node<T> * getMin(Node<T> *node){
			if (node==NULL)
			{
				return NULL;
			}
			while (node->left!=NULL)
			{
				node = node->left;
			}

			return node;
		}

		Node<T> * getMax(Node<T> * node){
			if (node==NULL)
			{
				return NULL;
			}
			while (node->right!=NULL)
			{
				node = node->right;
			}

			return node;
		}
		void change(Node<T>* node){
			changeToList(node);

			while (node->left!=NULL)
			{
				node = node->left;
			}
			root = node;
		}
		void changeToList(Node<T>* node){
			if (node==NULL)
			{
				return;
			}

			changeToList(node->left);
			changeToList(node->right);

			node->left = getMax(node->left);
			if (node->left!=NULL)
			{
				node->left->right = node;
			}
			

			node->right = getMin(node->right);
			if (node->right!=NULL)
			{
				node->right->left = node;
			}
			

		}

		void print(Node<T>* root){
			while (root)
			{
				cout<<root->ele<<" ";
			}
			cout<<endl;
		}
	private:
		Node<T>* root;
	};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值