LeetCode 426. 将二叉搜索树转化为排序的双向链表
生活随笔
收集整理的這篇文章主要介紹了
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. 将二叉搜索树转化为排序的双向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: Array.slice 8 种不同用法
- 下一篇: Nginx 之五: Nginx服务器的负