问题描述
给定一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3] 输出:[2,3,1]
示例 3:
输入:root = [] 输出:[]
解决方案
1、二叉树+递归:
确定函数的返回值(返回其根节点:TreeNode*)。
定义返回条件(root==NULL)。
递归遍历,开始操作。
开始新的递归。
2、swap 交换模板函数详细描述:
template<typename T> void Swap(T & x, T & y) { T tmp = x; x = y; y = tmp; }
3、前序(根左右):先swap 交换,再逐一处理每个根节点
swap(root->left,root->right); invertTree(root->left); invertTree(root->right);
后序(左右根):把swap 放在最后,先进入最深层节点,再进行swap 交换,逐一返回交换
invertTree(root->left); invertTree(root->right); swap(root->left,root->right);
中序(左根右):把swap 放在递归函数中间,右递归变为左递归(即实际上为 左根左 顺序)
invertTree(root->left); swap(root->left,root->right); invertTree(root->left);
函数代码
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ 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; } void Swap(TreeNode* & x, TreeNode* & y) { TreeNode* tmp = x; x = y; y = tmp; } };