题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/
6 10
/ \ /
5 7 9 11
镜像二叉树
8
/
10 6
/ \ /
11 9 7 5
思路
递归实现:(较为简洁)
遍历树的所有节点,如节点有子节点,则交换左右子节点.直至交换完所有非叶节点的左右子节点
循环实现:(思路与递归类似)
额外创建一个queue容器适配器(每次弹出队首元素,交换其左右子节点,然后再将二者入队,直至队列中没有元素而完毕)
注:对于顺序容器(vector, list等)使用push_back; 对于容器适配器(queue, stack等)使用push
即对于队列q:
q.push():在尾部添加元素,而非push_back()
q.pop():删除队首元素,但不返回
q.front():返回队首元素但不删除
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
/************递归实现************
//检验有效性
if(pRoot == nullptr)
return;
if(pRoot->left == nullptr && pRoot->right == nullptr)
return;
//swap
TreeNode* pTemp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = pTemp;
if(pRoot->left)
Mirror(pRoot->left);
if(pRoot->right)
Mirror(pRoot->right);
*/
/************循环实现************/
//检验有效性
if(pRoot == nullptr)
return;
if(pRoot->left == nullptr && pRoot->right == nullptr)
return;
//建立一个队列用于存放树的节点
queue<TreeNode*> qTree;
qTree.push(pRoot);
//TreeNode* pOfQueueFront = nullptr;
while(!qTree.empty())
{
//设一个指针接收每次队列头部元素
TreeNode* pOfQueueFront = qTree.front();
qTree.pop();
swap(pOfQueueFront->left, pOfQueueFront->right);
/*
TreeNode* pTemp = pOfQueueFront->left;
pOfQueueFront->left = pOfQueueFront->right;
pOfQueueFront->right = pTemp;
*/
if(pOfQueueFront->left)
qTree.push(pOfQueueFront->left);
if(pOfQueueFront->right)
qTree.push(pOfQueueFront->right);
}
}
};