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 代码优化

posted @ 2018-11-24 21:49  十步一杀2017  阅读(179)  评论(0编辑  收藏  举报