【剑指offer】面试题27 二叉树的镜像

有关剑指offer题目的解析:剑指offer 题目整理

题目描述

操作给定的二叉树,将其变换为源二叉树的镜像,在给定的树上操作,不需要返回新的树。

题目分析

【剑指offer】面试题27 二叉树的镜像_第1张图片
观察源二叉树和镜像二叉树发现,根节点8相同,再观察根的左右(6,10)子节点,发现源二叉树根的左右(6,10)节点和镜像二叉树的左右节点(10,6)互换了位置继续比较剩余的子节点依然是相互交换了位置,所以根据这个结论可以得到,我们递归的去交换了左右孩子节点即可完成要求。

注:如果是空指针,或者到达了叶子节点,那么不执行交换的操作。

主要代码c++

/*
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 || (pRoot->left == nullptr && pRoot->right == nullptr))
            return; // 空或者到达叶子结点 不需要操作
        // 交换节点的左右子树
        // 因为不能新建一棵树,所以用临时变量进行交换操作
        TreeNode* pTemp = pRoot->left; 
        pRoot->left = pRoot->right;
        pRoot->right = pTemp;
        // 然后对左右子树进行递归操作
        if(pRoot->left) 
            Mirror(pRoot->left);
        if(pRoot->right)
            Mirror(pRoot->right);
    }
};

python

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回镜像树的根节点
    def Mirror(self, root):
    	#保证树非空并且有左孩子或者右孩子孩子
        if not root or (not root.left and not root.right):
            return None
        # 交换左右孩子
        tmp = root.left
        root.left = root.right
        root.right = tmp
        # 递归即可
        if root.left:
            self.Mirror(root.left)
        if root.right:
            self.Mirror(root.right)
           

你可能感兴趣的:(剑指offer)