#include <iostream>

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

void flatten(TreeNode* root) {
    std::cout << "In flatten\n";
    std::cout << "Address of root pointer: " << &root << '\n';
    std::cout << "Addresss contained by root pointer: " << root << '\n';
    std::cout << "Value contained: " << root->val <<"\n\n";

    std::cout << "Assigning to root.\n\n";
    root = new TreeNode(0);

    std::cout << "Address of root pointer: " << &root << '\n';
    std::cout << "Addresss contained by root pointer: " << root << '\n';
    std::cout << "Value contained: " << root->val << "\n\n";
    std::cout << "Leaving flatten.\n\n";
}

int main()
{
    TreeNode * tree = new TreeNode(2);

    std::cout << "Address of tree pointer: " << &tree << '\n';
    std::cout << "Address contained by tree pointer: " << tree << '\n';
    std::cout << "Value contained: " << tree->val << "\n\n";

    flatten(tree);

    std::cout << "Address of tree pointer: " << &tree << '\n';
    std::cout << "Address contained by tree pointer: " << tree << '\n';
    std::cout << "Value contained: " << tree->val << "\n\n";
}