劍指offer——二叉樹的映象C++

baixiaofei567發表於2020-12-26

在這裡插入圖片描述
不難,遞迴和迭代兩個版本。遞迴注意遞迴邊界,在這裡順便也檢測了魯棒性。改變這個結點的左右孩子,無論是不是空結點。然後遞迴改變左右孩子。
迭代:bfs即可

/*
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;
        //遞迴變換即可,來一個結點存左子結點,右給左,左給右。然後遞迴變化左右結點,如果操作到空結點就return
        TreeNode* jilu = pRoot->left;
        pRoot->left = pRoot->right;
        pRoot->right = jilu;
        Mirror(pRoot->left);
        Mirror(pRoot->right);*/
        
        //迭代版本,bfs操作當前結點時交換兩個子結點即可
        if(!pRoot) return;
        queue<TreeNode*> q;
        q.push(pRoot);
        while(!q.empty()){
            TreeNode* topNode = q.front();
            q.pop();
            TreeNode* tmp = topNode->left;
            topNode->left = topNode->right;
            topNode->right = tmp;
            if(topNode->left != NULL) q.push(topNode->left);
            if(topNode->right != NULL) q.push(topNode->right);
        }
    }
};

相關文章