6 二叉树的镜像
0 引言
问题:请完成一个函数,输入一个二叉树,该函数输出它的镜像. 二叉树的结点定义如下:
struct TreeNode { int val; TreeNode* left; TreeNode* right; }
1 抽象问题具体化
举例1:
举例2:
举例3:输入为空,返回为空
2 具体问题抽象分析
语言+伪代码描述算法流程
(1)第一层遍历:前序递归遍历给定二叉树
1)对头结点输入有效性进行判断
2)完成前序递归遍历操作,访问头结点,递归访问左子树,递归访问右子树
3)访问头结点时,实现左右子树交换
伪代码如下.
Void Mirror(TreeNode* pRoot){ // 防御式编程,首先对头结点进行判断 if(pRoot == NULL)
return;
// 前序遍历访问头结点
访问pRoot,交换其左右结点,ExchangeLeftAndRightChild(pRoot);
Mirror(pRoot->left);
Mirror(pRoot->right); }
(2)实现void ExchangeLeftAndRightChild(TreeNode* pRoot);
void ExchangeLeftAndRightChild(TreeNode* pRoot){ TreeNode* temp;
temp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = temp; }
3 demo
void ExchangeLeftAndRightChild(TreeNode* pRoot){ TreeNode* temp; temp = pRoot->left; pRoot->left = pRoot->right; pRoot->right = temp; } void Mirror(TreeNode *pRoot) { // 防御式编程,首先对头结点进行判断 if(pRoot == NULL) return; // 前序遍历访问头结点 ExchangeLeftAndRightChild(pRoot); Mirror(pRoot->left); Mirror(pRoot->right); }
4 代码优化