题目描述
方法一:中序遍历
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr) return nullptr;
//找到左结点
invertTree(root->left);
//开始交换孩子结点
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
//找到交换前的右孩子,交换后的左孩子
invertTree(root->left);
return root;
}
方法二:先序遍历
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr) return nullptr;
//先保存其中一个交换结点
TreeNode* temp = root->left;
//开始交换
root->left = invertTree(root->right);
root->right = invertTree(temp);
return root;
}
注: 刚开始一直不理解递归到底是怎么一个逻辑,冥思苦想这个算法好像时间才稍微有一点头绪。上面算法中调用invertTree的地方其实并不是为了让该函数计算然后返回一个运行结果(通过两个return语句可以看见,要么返回nullptr,要么传入的什么返回的什么),而是将子节点当作参数传入函数,一层一层调用,二叉树也一层一层深入,使得子树执行与完整的二叉树相同的操作(交换子节点)。
方法三:后序遍历
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr) return nullptr;
TreeNode* leftNode = invertTree(root->left);
TreeNode* rightNode = invertTree(root->right);
root->left = rightNode;
root->right = leftNode;
return root;
}