剑指offer27.二叉树的镜像

题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:

二叉树的镜像定义:源二叉树 
    	    8
    	   /  \
    	  6   10
    	 / \  / \
    	5  7 9 11
    	镜像二叉树
    	    8
    	   /  \
    	  10   6
    	 / \  / \
    	11 9 7  5

完整代码

基本思想
采用后序遍历的方式构造一棵镜像二叉树

  • 先构造左子树
  • 再构造右子树
  • 将构造的左子树连接在根节点的右子树上,将构造的右子树连接在根节点的左子树上
/*
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==NULL)
            return;
        pRoot=build(pRoot);
    }
private:
    TreeNode* build(TreeNode* root){
        if(root==NULL)
            return root;
        TreeNode *left=build(root->left);
        TreeNode *right=build(root->right);
        root->left=right;
        root->right=left;
        return root;
    }
};

解法二
直接在原树上镜像

  • 先将根节点的右子树镜像,镜像完连接在左子树上
  • 再将根节点的左子树镜像,镜像完连接在右子树上
/*
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 == NULL)
            return;
        TreeNode *temp;
        //1.先将二叉树的右子树镜像
        Mirror(pRoot->right);
        temp = pRoot->left;//需要暂存左子树的指针
        //将镜像后的右子树链接在左子树上
        pRoot->left = pRoot->right;
        //2.将二叉树的左子树镜像
        Mirror(temp);
        //将镜像后的二叉树链接在右子树上
        pRoot->right = temp;
    }
};

剑指offer思想
基本思想:采用先序遍历的思想进行镜像

  • 先交换根节点的左右子树
  • 再将根节点的左子树、右子树镜像

递归上述过程

/*
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 == NULL)
            return;
        
        TreeNode* temp = pRoot->left;
        pRoot->left = pRoot->right;
        pRoot->right = temp;
        
        Mirror(pRoot->left);
        Mirror(pRoot->right);
    }
};
发布了217 篇原创文章 · 获赞 9 · 访问量 3万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览