LeetCode 156: Binary Tree Upside Down (Left-Spine Rewiring)
LeetCode 156TreeDFSPointer RewireToday we solve LeetCode 156 - Binary Tree Upside Down.
Source: https://leetcode.com/problems/binary-tree-upside-down/
English
Problem Summary
Given a binary tree where each right node is either a leaf (with a left sibling) or null, flip the tree upside down so the original leftmost node becomes new root. For each old parent, the old right child becomes new left child, and the old parent becomes new right child.
Key Insight
Only the left spine decides the new root. Walk downward along left pointers and rewire three pointers per step: cur.left = prevRight, cur.right = prev, then advance.
Complexity
Time: O(n).
Space: O(1) iterative, O(h) recursive.
Reference Implementations (Java / Go / C++ / Python / JavaScript)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val; this.left = left; this.right = right;
* }
* }
*/
class Solution {
public TreeNode upsideDownBinaryTree(TreeNode root) {
TreeNode prev = null, prevRight = null, cur = root;
while (cur != null) {
TreeNode next = cur.left;
cur.left = prevRight;
prevRight = cur.right;
cur.right = prev;
prev = cur;
cur = next;
}
return prev;
}
}/**
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func upsideDownBinaryTree(root *TreeNode) *TreeNode {
var prev, prevRight *TreeNode
cur := root
for cur != nil {
next := cur.Left
cur.Left = prevRight
prevRight = cur.Right
cur.Right = prev
prev = cur
cur = next
}
return prev
}/**
* 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 *prev = nullptr, *prevRight = nullptr, *cur = root;
while (cur) {
TreeNode* next = cur->left;
cur->left = prevRight;
prevRight = cur->right;
cur->right = prev;
prev = cur;
cur = next;
}
return prev;
}
};# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def upsideDownBinaryTree(self, root):
prev = None
prev_right = None
cur = root
while cur:
nxt = cur.left
cur.left = prev_right
prev_right = cur.right
cur.right = prev
prev = cur
cur = nxt
return prev/**
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
var upsideDownBinaryTree = function(root) {
let prev = null, prevRight = null, cur = root;
while (cur) {
const next = cur.left;
cur.left = prevRight;
prevRight = cur.right;
cur.right = prev;
prev = cur;
cur = next;
}
return prev;
};中文
题目概述
给定一棵二叉树(满足右子节点要么为空,要么是叶子且有左兄弟),将其“上下翻转”:原最左节点成为新根;每个旧父节点的右子节点变成新左子节点,旧父节点本身变成新右子节点。
核心思路
关键在于沿着左链向下走并原地改指针。每一步维护三个变量:当前节点 cur、上一层节点 prev、上一层右子 prevRight,按固定顺序重连即可避免丢链。
复杂度分析
时间复杂度:O(n)。
空间复杂度:迭代版 O(1),递归版 O(h)。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val; this.left = left; this.right = right;
* }
* }
*/
class Solution {
public TreeNode upsideDownBinaryTree(TreeNode root) {
TreeNode prev = null, prevRight = null, cur = root;
while (cur != null) {
TreeNode next = cur.left;
cur.left = prevRight;
prevRight = cur.right;
cur.right = prev;
prev = cur;
cur = next;
}
return prev;
}
}/**
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func upsideDownBinaryTree(root *TreeNode) *TreeNode {
var prev, prevRight *TreeNode
cur := root
for cur != nil {
next := cur.Left
cur.Left = prevRight
prevRight = cur.Right
cur.Right = prev
prev = cur
cur = next
}
return prev
}/**
* 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 *prev = nullptr, *prevRight = nullptr, *cur = root;
while (cur) {
TreeNode* next = cur->left;
cur->left = prevRight;
prevRight = cur->right;
cur->right = prev;
prev = cur;
cur = next;
}
return prev;
}
};# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def upsideDownBinaryTree(self, root):
prev = None
prev_right = None
cur = root
while cur:
nxt = cur.left
cur.left = prev_right
prev_right = cur.right
cur.right = prev
prev = cur
cur = nxt
return prev/**
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
var upsideDownBinaryTree = function(root) {
let prev = null, prevRight = null, cur = root;
while (cur) {
const next = cur.left;
cur.left = prevRight;
prevRight = cur.right;
cur.right = prev;
prev = cur;
cur = next;
}
return prev;
};
Comments