1. 程式人生 > 其它 >力扣--劍指offer--27二叉樹映象(非遞迴和遞迴)

力扣--劍指offer--27二叉樹映象(非遞迴和遞迴)

技術標籤:二叉樹演算法

請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。
(ps:也不知道咋整的,貼過來的文字就老偏,所以就自己畫了一個,嘻嘻)

例如輸入:
在這裡插入圖片描述
映象輸出:
在這裡插入圖片描述
因為才學過二叉樹的各種遍歷嘛,而且我這個腦子本來也不太能想到遞迴,所以我一開始看到這個題,輸入是二叉樹的層序遍歷,然後輸出就是將層序遍歷的每個結點的左右結點的位置改變的一下,那我們是否可以通過將元素放入到佇列以後,彈出隊首的時候交換一下左右結點來解決這個問題呢?

class Solution {
public:
    TreeNode* mirrorTree(TreeNode* root) {
        if
(root == NULL) return root; queue<TreeNode*> s; s.push(root); while(!s.empty()) { TreeNode*p = s.front(); s.pop(); if(p->left != NULL){ s.push(p->left); } if
(p->right != NULL){ s.push(p->right); } TreeNode*temp = p->right; p->right = p->left; p->left = temp; } return root; } };

輸入:root = [4,2,7,1,3,6,9]
輸出:[4,7,2,9,6,3,1]
然後就又去看了一下題解,發現大家很多用遞迴做的!wow!可以,一看就明白啦!

class Solution {
public:
    TreeNode* mirrorTree(TreeNode* root) {
     if (root == NULL) {
      return NULL;
    }

    TreeNode* temp = root->left;
    root->left = root->right;
    root->right = temp;

    if (root->left != NULL) {
      root->left = mirrorTree(root->left);
    }
    if (root->right != NULL) {
      root->right = mirrorTree(root->right);
    }
    return root;
        
    }
};