#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";
}