首先很容易想到的一种做法就是:用 vector 将所以树结点按照中序遍历的方式存下来,然后遍历 vector 链接即可。(二叉搜索树中序遍历是按 val 顺序保存的)
也就是说:
void solve(Node *root) { if(!root) return ; solve(root -> left); printf("%d ", root -> val); solve(root -> right); }
这样子,printf 出来的 val 是有序的。所以只需要利用一个变量来保存前驱即可。
如果在 solve(root -> left) 与 solve(root -> right) 中间,pre 的值不是空,那么就有前驱,链接起来就行。
但是题目还要求最小的和最大的相连,所以 pre 出现为空的情况,即到达最小节点处,保存 minNode...
遍历完后的 pre 就是在最大节点处
class Solution { public: Node* treeToDoublyList(Node* root) { if(!root) return root; minNode -> left = pre; pre -> right = minNode; return minNode; } private: Node *pre = nullptr, *minNode = nullptr; void solve(Node *root) { if(!root) return ; solve(root -> left); if(pre) pre -> right = root; else minNode = root; root -> left = pre; pre = root; solve(root -> right); } };