Почему переключение родительских узлов не переключает его дочерние узлы? - PullRequest
0 голосов
/ 15 апреля 2020

Например, в этом вопросе: 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;
    }

Не будет ли переключение родительских узлов поддеревьев также переключением его потомков?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Начните с дерева (минимум три уровня):

      A
    /   \
  B       C
 / \     / \
D   E   F   G

Поменяйте местами левого и правого потомков root:

      A
    /   \
  C       B
 / \     / \
F   G   D   E

Обратите внимание, что вы еще не у перевернутого дерева:

      A
    /   \
  C       B
 / \     / \
G   F   E   D
0 голосов
/ 15 апреля 2020

Обмен левого и правого указателей только меняет указатели, но указатели поддеревьев (далее) также должны быть инвертированы. Вот почему вы должны загнать левые и правые деревья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...