给定一个二叉树,其中所有的右节点要么是具有兄弟节点(拥有相同父节点的左节点)的叶节点,要么为空,将此二叉树上下翻转并将它变成一棵树, 原来的右节点将转换成左叶节点。返回新的根。
例子:
输入: [1,2,3,4,5]
1
/ \
2 3
/ \
4 5
输出: 返回二叉树的根 [4,5,2,#,#,3,1]
4
/ \
5 2
/ \
3 1
说明:
对 [4,5,2,#,#,3,1] 感到困惑? 下面详细介绍请查看 二叉树是如何被序列化的。
二叉树的序列化遵循层次遍历规则,当没有节点存在时,'#' 表示路径终止符。
这里有一个例子:
1
/ \
2 3
/
4
\
5
上面的二叉树则被序列化为 [1,2,3,#,#,4,#,#,5].
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* DFS(struct TreeNode* root)
{
if(!root||(!root->left&&!root->right))return root;
//root->left,为此层根节点,为左子树的叶节点
struct TreeNode* tmp=root->left;
struct TreeNode* ret=DFS(tmp);
tmp->left=root->right;
tmp->right=root;
root->right=NULL;
root->left=NULL;
return ret;
}
struct TreeNode* upsideDownBinaryTree(struct TreeNode* root){
return DFS(root);
}
执行用时 :4 ms, 在所有 C 提交中击败了100.00% 的用户
内存消耗 :7.4 MB, 在所有 C 提交中击败了100.00%的用户