启蒙自助建站/电商卖货平台有哪些
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向 。返回双向链表的头节点。
分析:
在二叉搜索树中左子节点的值总是小于父亲节点的值,右子节点的值总是大于父亲节点的值。使用中序遍历去遍历二叉搜索树的结果就是一组排序好的数据,我们只需要用指针将节点连接起来。节点的左指针变成指向前一个节点的指针,右指针变成指向后一个节点的指针。我们需要一个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);}
};