题解 | #二叉搜索树与双向链表#
二叉搜索树与双向链表
https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree==nullptr){ return nullptr; } TreeNode * ret=dfs(pRootOfTree); TreeNode * retlast=ret->left; retlast->right=nullptr; ret->left=nullptr; return ret; } TreeNode * dfs(TreeNode * pRootOfTree){ if(pRootOfTree==nullptr){ return nullptr; } TreeNode * left=dfs(pRootOfTree->left); TreeNode * right=dfs(pRootOfTree->right); TreeNode * start=pRootOfTree; TreeNode * end=pRootOfTree; if(left!=nullptr){ TreeNode * leftLast=left->left; leftLast->right=pRootOfTree; pRootOfTree->left=leftLast; // left->left=nullptr; start=left; }//middle //process right sub tree //将中间节点拼接到右边子树的开头,把末尾和开头相连。 if(right!=nullptr){ TreeNode * rightLast=right->left; pRootOfTree->right=right; right->left=pRootOfTree; end=rightLast; } start->left=end; end->right=start; return start; } };
递归,关键是确定好三种条件:
1.主节点nullptr
2.左右子节点nullptr的情况
3.考虑递归到最下层节点的情况
总之,
1.等价于处理左子树,生成链表
2.处理右子树,生成链表
3.中间节点接在左子树末端,再接到右子树首端
4.既然都是返回头结点或者尾节点,怎么才能获取左子树末端的情况?
确认返回的是循环链表。
所以算法是
1.生成循环链表,从小到大,返回头
2.同样
3.中间节点接好
4.返回循环链表
5.最外一层,调用,并且解开。