思路:
题目的主要信息:
- 将二叉树镜像,即将其所有左右子树交换
我们可以考虑自底向上依次交换二叉树的左右结点。
方法一:递归
具体做法:
采用递归的方法,首先深入到二叉树的叶子结点,交换其左右,然后依次往上交换。
class Solution { public: TreeNode* Mirror(TreeNode* pRoot) { if (pRoot == NULL) //空树返回 return NULL; TreeNode* left = Mirror(pRoot->left); //先递归子树 TreeNode* right = Mirror(pRoot->right); pRoot->left = right; //交换 pRoot->right = left; return pRoot; } };
复杂度分析:
- 时间复杂度:,访问二叉树所有结点各一次
- 空间复杂度:,递归栈最大值
方法二:栈
具体做法:
能够用递归的,我们也可以用栈来实现。栈的访问是一种自顶向下的访问,因此我们需要在左右子结点入栈后直接交换,然后再访问后续栈中内容。
class Solution { public: TreeNode* Mirror(TreeNode* pRoot) { if(pRoot == NULL) //空树 return NULL; stack<TreeNode*> s; //辅助栈 s.push(pRoot); while (!s.empty()) { TreeNode* node = s.top(); s.pop(); if (node->left != NULL) s.push(node->left); if (node->right != NULL) s.push(node->right); //左右结点入栈 TreeNode* temp = node->left; //交换左右 node->left = node->right; node->right = temp; } return pRoot; } };
复杂度分析:
- 时间复杂度:,每个结点遍历一次
- 空间复杂度:,最坏情况下,栈的大小