## 题目地址 https://leetcode-cn.com/problems/invert-binary-tree/ ## 思路 ### 递归法 写递归算法的时候,要想一想是采用前中后序哪种遍历方式 o 如果对递归还不熟,可以看这里[彻底吃透二叉树的前中后序递归法和迭代法!!](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/che-di-chi-tou-er-cha-shu-de-qian-zhong-hou-xu-d-2/) 我们先看看递归算法,对于二叉树的递归方式有三种前中后序,先来看看前序遍历。 通过动画来看一下翻转的过程: 递归三部曲: 1. 确定递归函数的参数和返回值 参数就是要传入节点的指针,不需要其他参数了,返回值的话其实也不需要,但是题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就返回一个指针。 ``` TreeNode* invertTree(TreeNode* root) ``` 2. 确定终止条件 当前节点为空的时候,就返回 ``` if (root == NULL) return root; ``` 3. 确定单层递归的逻辑 因为是先序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。 ``` swap(root->left, root->right); invertTree(root->left); invertTree(root->right); ``` 基于这递归三步法,代码基本写完,C++代码如下: ``` class Solution { public: TreeNode* invertTree(TreeNode* root) { if (root == NULL) return root; swap(root->left, root->right); invertTree(root->left); invertTree(root->right); return root; } }; ``` ### 迭代法 [leetcode-master](https://github.com/youngyangyang04/leetcode-master) 中给出了 前中后序迭代法统一的模板,使用前序遍历,只需要改动一行就可以了,代码在下面已经给出。 ## C++代码 ### 递归(前序遍历) ``` class Solution { public: TreeNode* invertTree(TreeNode* root) { if (root == NULL) return root; swap(root->left, root->right); invertTree(root->left); invertTree(root->right); return root; } }; ``` ### 迭代法(前序遍历) ``` class Solution { public: TreeNode* invertTree(TreeNode* root) { if (root == NULL) return root; stack st; st.push(root); while(!st.empty()) { TreeNode* node = st.top(); st.pop(); swap(node->left, node->right); if(node->left) st.push(node->left); if(node->right) st.push(node->right); } return root; } }; ``` ### 迭代法(前序遍历)(模板) 模板地址:[leetcode-master](https://github.com/youngyangyang04/leetcode-master) ``` class Solution { public: TreeNode* invertTree(TreeNode* root) { stack st; if (root != NULL) st.push(root); while (!st.empty()) { TreeNode* node = st.top(); if (node != NULL) { st.pop(); if (node->right) st.push(node->right); // 添加右节点 if (node->left) st.push(node->left); // 添加左节点 st.push(node); // 添加中节点 st.push(NULL); } else { st.pop(); node = st.top(); st.pop(); swap(node->left, node->right); // 节点处理逻辑 } } return root; } }; ``` > 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。