题目描述
给定一个二叉树,其中所有的右节点要么是具有兄弟节点(拥有相同父节点的左节点)的叶节点,要么为空,将此二叉树上下翻转并将它变成一棵树, 原来的右节点将转换成左叶节点。返回新的根。
解题思路
把树倒过来看
对于任意一个节点,它的右节点变成左孩子的左孩子,自己变成左孩子的右孩子。对于每一个节点的左孩子重新设置左右节点。
定义一个dfs函数,功能如下
1. node为null,则直接return
2. node为叶子节点
如果head为空,则head = node(最左边的节点即为根节点)
扫描二维码关注公众号,回复:
11959556 查看本文章
直接return node
3. node 不是叶子节点也不为 null,则把 node 的右子节点作为 node 的左子节点的左子节点,node 自己作为它左子节点的右子节点,最后 node 的左右子结点置空,即不再是原来左右子结点的父节点了。
/**
* 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 {
private TreeNode head;//翻转之后的新的根节点
public TreeNode upsideDownBinaryTree(TreeNode root) {
if(root == null){
return null;
}
dfs(root);
return head;
}
public TreeNode dfs(TreeNode node){
if(node == null){
return null;
}
if(node.left == null && node.right == null){
if(head == null){//最左的节点就是新的根节点
head = node;
}
return node;
}
TreeNode left = dfs(node.left);
TreeNode right = dfs(node.right);
if(left != null){
left.left = right;//左孩子的左子树成为当前的右节点
left.right = node;//左孩子的右子树为其父节点(也即node)
}
//清空当前父节点的左右子树
node.left = null;
node.right = null;
return node;
}
}