题目:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
解析:
- 1、经典递归(剑指上的解):二叉树的镜像就是通过交换所有结点的左右子树而来的,所以利用递归思想便可求解。
- 2、栈的解法(栈模拟二叉树的先序遍历)。
- 3、队列的解法(队列模拟二叉树的层序遍历)。
参考答案:
/***
* typedef struct node{
* int m_Value;
* struct node *m_Left;
* struct node *m_Right;
* }TreeNode;
*/
class Solution{
public:
//递归
TreeNode * mirrorTree(TreeNode *root){
if(nullptr == root){
return nullptr;
}
TreeNode *temp = root -> m_Left;
root -> m_Left = root -> m_Right;
root -> m_Right = temp;
if(root -> m_Left)
mirrorTree(root -> m_Left);
if(root -> m_Right)
mirrorTree(root -> m_Right);
return root;
}
//栈
TreeNode * mirrorTree(TreeNode *root){
if(nullptr == root){
return nullptr;
}
stack<TreeNode*> s;
s.push(root);
while(!s.empty){
TreeNode* node = s.top();
s.pop();
if(nullptr == node){
continue;
}
swap(node->left, node->right);
s.push(node->left);
s.push(node->right);
}
return root;
}
//队列
TreeNode * mirrorTree(TreeNode *root){
if(nullptr == root){
return nullptr;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* node = q.front();
q.pop();
if(nullptr == node){
continue;
}
swap(node->left, node->right);
q.push(node->left);
q.push(node->right);
}
return root;
}
};