欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 426. 将二叉搜索树转化为排序的双向链表

发布时间:2025/7/25 编程问答 90 豆豆
生活随笔 收集整理的这篇文章主要介绍了 LeetCode 426. 将二叉搜索树转化为排序的双向链表 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。

为了让您更好地理解问题,以下面的二叉搜索树为例:

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。

特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。

算法:我们知道,返回的双向链表是排好序的,所以我们需要利用BST的中序遍历。我们先递归整个左子树,再递归整个右子树。需要注意的是,左子树最右边的结点的后继结点就是根结点,而右子树最左边的结点的前驱结点是根节点。为了对应这种关系,我们利用pair进行结点的存储。最后不要忘了做循环处理即可。

/* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node() {}Node(int _val, Node* _left, Node* _right) {val = _val;left = _left;right = _right;} }; */ class Solution { public:pair<Node*, Node*>dfs(Node* root){if(!root->left&&!root->right)return {root,root};if(root->left&&root->right){auto ls=dfs(root->left), rs=dfs(root->right);ls.second->right=root,root->left=ls.second;rs.first->left=root,root->right=rs.first;return {ls.first, rs.second};}if(root->left){auto ls=dfs(root->left);ls.second->right=root,root->left=ls.second;return {ls.first, root};}if(root->right){auto rs=dfs(root->right);rs.first->left=root,root->right=rs.first;return {root, rs.second};}return {root,root};}Node* treeToDoublyList(Node* root) {if(!root)return NULL;auto side=dfs(root);side.first->left=side.second;side.second->right=side.first;return side.first;} };

 

转载于:https://www.cnblogs.com/programyang/p/11161866.html

总结

以上是生活随笔为你收集整理的LeetCode 426. 将二叉搜索树转化为排序的双向链表的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。