题目描述
给定一棵二叉树,所有右节点要么是空,要么是叶节点加左兄弟节点。
通俗来讲,这棵二叉树是一条左链,上面挂着若干右儿子,如下所示:
现在请将左链自下到上翻转成右链,并将所有右儿子换到左侧。
样例
输入:[1,2,3,4,5]
1
/ \
2 3
/ \
4 5
输出:[4,5,2,#,#,3,1]
4
/ \
5 2
/ \
3 1
算法
(模拟,二叉树操作) $O(n)$
递归翻转整个左链,每次将根节点插在左儿子的右侧,将右儿子挂在左儿子的左侧。
最后要将根节点的左右儿子清空(其实只需将整棵树的根节点清空,但所有节点都清空一遍比较好写)。
时间复杂度分析:每个节点仅被遍历一遍,所以时间复杂度是 $O(n)$。
C++ 代码
/**
* 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:
TreeNode* upsideDownBinaryTree(TreeNode* root) {
if (!root || !root->left) return root;
TreeNode *newRoot = upsideDownBinaryTree(root->left);
root->left->left = root->right;
root->left->right = root;
root->left = root->right = 0;
return newRoot;
}
};