Например, в этом вопросе: https://leetcode.com/problems/invert-binary-tree/ Правильное решение:
TreeNode* invertTree(TreeNode* root) { if(root!=NULL) { TreeNode* tmp = (root->left); root->left=root->right; root->right=tmp; invertTree(root->left); invertTree(root->right); } return root; }
Однако, почему мы не можем просто сделать:
TreeNode* invertTree(TreeNode* root) { if(root!=NULL) { TreeNode* tmp = (root->left); root->left=root->right; root->right=tmp; } return root; }
Не будет ли переключение родительских узлов поддеревьев также переключением его потомков?
Начните с дерева (минимум три уровня):
A / \ B C / \ / \ D E F G
Поменяйте местами левого и правого потомков root:
A / \ C B / \ / \ F G D E
Обратите внимание, что вы еще не у перевернутого дерева:
A / \ C B / \ / \ G F E D
Обмен левого и правого указателей только меняет указатели, но указатели поддеревьев (далее) также должны быть инвертированы. Вот почему вы должны загнать левые и правые деревья.