1. Inorder Array Collection
Intuition
Perform a standard recursive inorder traversal, appending each visited node's data to a dynamic array or list. After visiting all N nodes, check if N is odd: return list[N / 2]. If N is even: return (list[N / 2 - 1] + list[N / 2]) / 2.0.
When to apply: When simplicity is paramount and O(N) space is permissible.
Algorithm
- Collect all node values in an array via standard inorder traversal and compute median from center elements.
#include <iostream>#include <vector> struct Node { int data; Node* left; Node* right; Node(int val) : data(val), left(nullptr), right(nullptr) {}}; class Solution { void inorder(Node* root, std::vector<int>& vals) { if (!root) return; inorder(root->left, vals); vals.push_back(root->data); inorder(root->right, vals); }public: double findMedian(Node* root) { std::vector<int> vals; inorder(root, vals); int n = vals.size(); if (n == 0) return 0; if (n % 2 != 0) { return vals[n / 2]; } else { return (vals[(n / 2) - 1] + vals[n / 2]) / 2.0; } }}; int main() { Node* root = new Node(6); root->left = new Node(3); root->right = new Node(8); root->left->left = new Node(1); root->left->right = new Node(4); root->right->left = new Node(7); root->right->right = new Node(9); Solution sol; std::cout << "Median: " << sol.findMedian(root) << std::endl; return 0;}Time & Space Complexity
- Time complexity:
O(N) - Space complexity:
O(N) auxiliary space