二叉樹鏡像


title: 2019-8-15 二叉樹鏡像
tags: 算法,每日一題,二叉樹


二叉樹鏡像

1. 題目描述

操作給定的二叉樹,將其變換爲源二叉樹的鏡像。

2. 題目解析

2.1 什麼是二叉樹鏡像

說白了就是一棵二叉樹在鏡中所成的像就是二叉樹的鏡像,具體看圖:

二叉樹的鏡像

2.2 解題思路

遞歸的方式

遞歸的方法的本質是將一個大問題拆分爲小問題,且這個小問題的解決方法是可以繼續按照大方法差分爲消防法的方式繼續差分爲更小的問題直到不能拆分爲止(也就是達到了所謂的遞歸基)。

step1:交換根節點左右子樹
step2:遞歸的交換當前節點的左右子樹
具體的步驟圖:
二叉樹的鏡像

/*
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;
        //step1:交換當前節點左右子樹
        TreeNode* temp = pRoot->left;
        pRoot->left = pRoot->right;
        pRoot->right = temp;
        //遞歸交換當前節點左右子樹
        Mirror(pRoot->left);
        Mirror(pRoot->right);
    }
    
};
非遞歸的方式

非遞歸的方式其實是可以借鑑遞歸的經驗。可以使用先序遍歷的方式,每次到達對應節點之後立即交換左右子樹。當然使用後續遍歷也是可以的,只是把這個過程的順序反了一下,由從根節點開始交換變成了從葉子節點開始交換。

/*
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;
        
        stack<TreeNode*> helpStack;
        if (pRoot) helpStack.push(pRoot);
        while(!helpStack.empty()){
            //交換左右子樹
            pRoot = helpStack.top(); helpStack.pop();
            TreeNode* temp = pRoot->left;
            pRoot->left = pRoot->right;
            pRoot->right = temp;
            //處理接下來的左右子樹
            if(pRoot->right) helpStack.push(pRoot->right);
            if(pRoot->left) helpStack.push(pRoot->left);
        }
    }
    
};

更多關於編程和機器學習資料請關注FlyAI公衆號。
公衆號二維碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章