1. 程式人生 > >LeetCode 226 Invert Binary Tree(轉換二叉樹)

LeetCode 226 Invert Binary Tree(轉換二叉樹)

public pretty mar containe ret clas move 出錯 uil

翻譯

將下圖中上面的二叉樹轉換為以下的形式。詳細為每一個左孩子節點和右孩子節點互換位置。

技術分享

原文

如上圖

分析

每次關於樹的題目出錯都在於邊界條件上……所以這次細致多想了一遍:

void swapNode(TreeNode* tree) {
    if (tree == NULL || (tree->left == NULL && tree->right == NULL)) {}
    else    if (tree->left == NULL && tree->right !=
NULL) { TreeNode* temp = tree->right; tree->left = temp; tree->right = nullptr; } else if (tree->right == NULL && tree->left != NULL) { TreeNode* temp = tree->left; tree->right = temp; tree->left = nullptr; } else
{ TreeNode* temp = tree->left; tree->left = tree->right; tree->right = temp; } }

不過這樣還不夠,它不過互換了一次。所以我們要用到遞歸:

if(tree->left != NULL)
    swapNode(tree->left);
if(tree->right != NULL)
    swapNode(tree->right);

最後在題目給定的函數內部調用自己寫的這個遞歸函數就好。

TreeNode* invertTree(TreeNode* root) {
    if (root == NULL) return NULL;
    swapNode(root);
    return root;
}

代碼

/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
    void swapNode(TreeNode* tree) {
        if (tree == NULL || (tree->left == NULL && tree->right == NULL)) {}
        else    if (tree->left == NULL && tree->right != NULL) {
            TreeNode* temp = tree->right;
            tree->left = temp;
            tree->right = nullptr;
        }
        else    if (tree->right == NULL && tree->left != NULL) {
            TreeNode* temp = tree->left;
            tree->right = temp;
            tree->left = nullptr;
        }
        else {
            TreeNode* temp = tree->left;
            tree->left = tree->right;
            tree->right = temp;
        }
        if (tree->left != NULL)
            swapNode(tree->left);
        if (tree->right != NULL)
            swapNode(tree->right);
    }

    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return NULL;
        swapNode(root);
        return root;
    }
};

學習

自己的解決方式還是太0基礎,所以來學習學習大神的解法:

TreeNode* invertTree(TreeNode* root) {

    if(nullptr == root) return root;

    queue<TreeNode*> myQueue;   // our queue to do BFS
    myQueue.push(root);         // push very first item - root

    while(!myQueue.empty()){    // run until there are nodes in the queue 
        TreeNode *node = myQueue.front();  // get element from queue
        myQueue.pop();                     // remove element from queue

        if(node->left != nullptr){         // add left kid to the queue if it exists
            myQueue.push(node->left);
        }
        if(node->right != nullptr){        // add right kid 
            myQueue.push(node->right);
        }

        // invert left and right pointers      
        TreeNode* tmp = node->left;
        node->left = node->right;
        node->right = tmp;

    }
    return root;
} 

爭取以後少用遞歸了。加油!

LeetCode 226 Invert Binary Tree(轉換二叉樹)