题目:翻转二叉树

以前序遍历为例,从根节点开始,逐步交换左右子树(先交换左子树,后交换右子树),直到所有叶子节点都交换完毕;后序遍历同理,先把左子树的所有节点交换完毕,再处理右子树,最后在root节点处将整个左右子树交换

而中序遍历是个特例,它会先交换左子树的所有节点,然后逐层返回到最顶部的root节点,将左子树和右子树交换,此时如果按照之前的逻辑,继续对右子树进行交换的话,相当于是对一开始的左子树又进行了一次交换,所有此时需要改变一下代码,进行对左子树)也就是一开始的右子树)进行交换,这样才能得到正确的结果

 1// 前序
 2TreeNode* invertTree(TreeNode* root)
 3{
 4    if(root == nullptr) return nullptr;
 5    std::swap(root->left, root->right);
 6    invertTree(root->left);
 7    invertTree(root->right);
 8
 9    return root;
10}
11
12// 中序
13TreeNode* invertTree(TreeNode* root)
14{
15    if(root == nullptr) return nullptr;
16    invertTree(root->left);
17    std::swap(root->left, root->right);
18    invertTree(root->left);
19
20    return root;
21}
22
23// 后序
24TreeNode* invertTree(TreeNode* root)
25{
26    if(root == nullptr) return nullptr;
27    invertTree(root->left);
28    invertTree(root->right);
29    std::swap(root->left, root->right);
30
31    return root;
32}