LeetCode-156 上下翻轉二叉樹
阿新 • • 發佈:2022-03-30
來源:力扣(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; } };
執行結果