1. 程式人生 > 其它 >LeetCode-156 上下翻轉二叉樹

LeetCode-156 上下翻轉二叉樹

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-tree-upside-down

題目描述

給你一個二叉樹的根節點 root ,請你將此二叉樹上下翻轉,並返回新的根節點。

你可以按下面的步驟翻轉一棵二叉樹:

原來的左子節點變成新的根節點
原來的根節點變成新的右子節點
原來的右子節點變成新的左子節點

 

 

上面的步驟逐層進行。題目資料保證每個右節點都有一個同級節點(即共享同一父節點的左節點)且不存在子節點。

 

示例 1:

 

 


輸入:root = [1,2,3,4,5]
輸出:[4,5,2,null,null,3,1]
示例 2:

輸入:root = []
輸出:[]
示例 3:

輸入:root = [1]
輸出:[1]
 

提示:

樹中節點數目在範圍 [0, 10] 內
1 <= Node.val <= 10
樹中的每個右節點都有一個同級節點(即共享同一父節點的左節點)
樹中的每個右節點都沒有子節點

 

解題思路

經過觀察發現僅僅是從下到上將父節點變成右結點,左結點變成父結點,右結點變成左結點,所以可以從下至上依次改變狀態,可以使用棧來輔助尋找每一個結點,也可以使用前序遍歷。

程式碼展示

棧輔助解法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 
*/ class Solution { public: TreeNode* upsideDownBinaryTree(TreeNode* root) { TreeNode* p = root; stack<TreeNode*> szStack; if(root) { while(p) { szStack.push(p); p = p->left; } root
= szStack.top(); while(!szStack.empty()) { p = szStack.top(); szStack.pop(); if(szStack.empty()) { p->left = nullptr; p->right = nullptr; } else { TreeNode* q = szStack.top(); p->left = q->right; p->right = q; } } } return root; } };

前序遍歷解法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* mRoot;
    void dfs(TreeNode* root, TreeNode* fa)
    {
        if(!root) return;
        if(!root->left)
            mRoot = root;
        dfs(root->left, root);
        root->left = fa? fa->right : nullptr;
        root->right = fa;
    }

    TreeNode* upsideDownBinaryTree(TreeNode* root) {
        dfs(root,nullptr);
        return mRoot;

    }
};

 

執行結果