牛客JZ36 二叉搜索树与双向链表 C++
思路🧐:
由图所示,我们看出该链表走的是中序,所以我们可以使用中序遍历的方式来解决这个问题,在遍历过程中,我们创建一个前驱和一个后继结点,来进行链接。
并且,我们需要判断前驱结点的情况,不然当走到空时,再链接就会发生错误,当前驱结点不为空时才进行链接,否则直接回到后继结点,不进行操作。
代码🔎:
class Solution { public: void InOrder(TreeNode* cur, TreeNode*& prev) { if(cur == nullptr) return; InOrder(cur->left, prev); cur->left = prev; if(prev) //如果prev不为空,就说明可以链接 prev->right = cur; prev = cur; //置回cur位置 InOrder(cur->right, prev); } TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode* cur = pRootOfTree, *prev = nullptr; InOrder(cur, prev); TreeNode* head = pRootOfTree; //找头 while(head && head->left) //找链表的头,由于是中序,一直向左找一定能找到 { head = head->left; } return head; } };