描述:輸入一顆二元查找樹,將二元查找樹轉換成一個排序的雙向鏈表。要求不能創建人新創建的結點,只調整指針的指向。
我的思路:利用遞歸思想進行解答。
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;
};