问题描述:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
思路:利用递归的思想求解,分别调整某结点的左右子树,调整完后,将该结点的左指针指向左子树的最大节点,右指针指向右子树的最小节点。
代码如下:
- BSTreeNode * Convert(BSTreeNode *node)
- {
- if(node == NULL)
- return NULL;
- BSTreeNode *leftMax,*rightMin;
- leftMax = node->left;
- rightMin = node->right;
- //找到左子树的最大结点
- while(leftMax != NULL && leftMax->right != NULL)
- leftMax = leftMax->right;
- //找到右子树的最小结点
- while(rightMin != NULL && rightMin->left != NULL)
- rightMin = rightMin->left;
- //递归求解
- Convert(node->right);
- Convert(node->left);
- //将左右子树同根结点连起来,只不过是以兄弟的关系
- if(leftMax != NULL)
- leftMax->right = node;
- if(rightMin != NULL)
- rightMin->left = node;
- node->left = leftMax;
- node->right = rightMin;
- return node;
- }