描述:输入一颗二元查找树,将二元查找树转换成一个排序的双向链表。要求不能创建人新创建的结点,只调整指针的指向。
我的思路:利用递归思想进行解答。
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;
};