题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向 。返回双向链表的头节点。
分析:
在二叉搜索树中左子节点的值总是小于父亲节点的值,右子节点的值总是大于父亲节点的值。使用中序遍历去遍历二叉搜索树的结果就是一组排序好的数据,我们只需要用指针将节点连接起来。节点的左指针变成指向前一个节点的指针,右指针变成指向后一个节点的指针。我们需要一个pListHead 指针来保存链表的头节点,需要一个pre指针来保存此时遍历到的节点的前一个节点。来帮助我们连接链表中的节点。
我们以上面的二叉搜索树为例,中序遍历先遍历到节点4,4是链表中的第一个节点,如果pre为NULL就证明我们现在在第一个节点,那么pListHead应该等于root,把pre指向root(4),然后root为6 则root->left为pre(4),pre->right为root(6),接着还是pre指向root(6),root为8,则root->left为pre(6),pre->right为root(8),pre指向root(8),中序遍历的顺序根左右,整棵左子树递归处理完毕以后就到了根节点。同样道理 root为10,pre指向链表尾结点 8 重复上述连接过程,整棵右子树也如此处理。
class Solution {
private:
Node* pListHead = NULL;
Node* pre = NULL;
public:
Node* treeToDoublyList(Node* root) {
if(root == NULL) return NULL;
ReConnectNode(root);
return pListHead;
}
void ReConnectNode(Node* root){
if(root == NULL) return;
ReConnectNode(root -> left);
if(pre == NULL)
pListHead = root;
else{
pre -> right = root;
root -> left = pre;
}
pre = root;
ReConnectNode(root -> right);
}
};