二元查找樹轉變成排序的雙向鏈表

描述:輸入一顆二元查找樹,將二元查找樹轉換成一個排序的雙向鏈表。要求不能創建人新創建的結點,只調整指針的指向。


我的思路:利用遞歸思想進行解答。

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;
	};


發佈了27 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章