《剑指offer》 二叉树的镜像

本题来自《剑指offer》 二叉树的镜像

题目:

  操作给定的二叉树,将其变换为源二叉树的镜像。
 二叉树的镜像定义:源二叉树 
    	    8
    	   /  \
    	  6   10
    	 / \  / \
    	5  7 9 11
    	镜像二叉树
    	    8
    	   /  \
    	  10   6
    	 / \  / \
    	11 9 7  5

思路:

    关于树,如果思路不够明确,可以画出图标辅助理解题目。

  画出几步就会得出通用的思路,镜像发现如果通过交换左右子节点,左子树又是树,右子树又是树。可以采用递归的思路。

  递归需要找到结束条件,如果根节点是是空或者当为子节点时候便结束本次递归。

C++ Code:

/*
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){                        //根节点如果为空,返回
            return ;
        }
        if (!pRoot->left && !pRoot->right){ //如果为子节点,返回
            return ;
        }
        TreeNode* temp;                     //交换左右子节点
        temp = pRoot->left;
        pRoot->left = pRoot->right;
        pRoot->right = temp;
        if (pRoot->left){                   //如果左节点不空,则调用左子树
            Mirror(pRoot->left);
        }
        if (pRoot->right){                  //如果右子树不空,则调用右子树
            Mirror(pRoot->right);
        }
    }
};

Python Code:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回镜像树的根节点
    def Mirror(self, root):
        # write code here
        if not root:                                #边界条件,空节点直接返回
            return None
        if not root.left and not root.right:        #若为子节点,返回空
            return None
        root.left,root.right = root.right,root.left #将左右子节点交换
        if root.left:
            self.Mirror(root.left)                      #递归调用左子树
        if root.right:
            self.Mirror(root.right)                     #递归调用右子树
        return root                                 #返回根节点

总结:

  三思后行。

  写代码之前将思路理顺,首先大的方向要正确的基础上,在确定小的细节。比如边界条件,要有防御性的代码考虑。

posted @ 2019-04-28 13:57  weilongyitian  阅读(155)  评论(0编辑  收藏  举报