1. Inorder Array Collection
Intuition
Perform an inorder traversal to append all tree node references into a list. Then iterate from 0 to N - 1, setting nodes[i].right = nodes[(i + 1) % N] and nodes[i].left = nodes[(i - 1 + N) % N]. Return nodes[0].
When to apply: Simpler mental model when extra memory is allowed.
Algorithm
- Step 1: If root is null, return null.
- Step 2: Collect all nodes in inorder array
nodes. - Step 3: Loop i from 0 to N - 1: link
nodes[i].right = nodes[(i + 1) % N]andnodes[i].left = nodes[(i - 1 + N) % N]. - Step 4: Return
nodes[0].
#include <iostream>#include <vector>using namespace std; struct Node { int val; Node* left; Node* right; Node(int _val) : val(_val), left(nullptr), right(nullptr) {}}; class Solution { void inorder(Node* root, vector<Node*>& nodes) { if (!root) return; inorder(root->left, nodes); nodes.push_back(root); inorder(root->right, nodes); }public: Node* treeToDoublyList(Node* root) { if (!root) return nullptr; vector<Node*> nodes; inorder(root, nodes); int n = nodes.size(); for (int i = 0; i < n; i++) { nodes[i]->right = nodes[(i + 1) % n]; nodes[i]->left = nodes[(i - 1 + n) % n]; } return nodes[0]; }}; int main() { Node* root = new Node(4); root->left = new Node(2); root->right = new Node(5); Solution sol; Node* head = sol.treeToDoublyList(root); cout << "Head: " << head->val << ", Next: " << head->right->val << endl; return 0;}Time & Space Complexity
- Time complexity:
O(N) - Space complexity:
O(N)