leetcode156上下翻二叉树

题目描述

给定一个二叉树,其中所有的右节点要么是具有兄弟节点(拥有相同父节点的左节点)的叶节点,要么为空,将此二叉树上下翻转并将它变成一棵树, 原来的右节点将转换成左叶节点。返回新的根。

解题思路

把树倒过来看

 对于任意一个节点,它的右节点变成左孩子的左孩子,自己变成左孩子的右孩子。对于每一个节点的左孩子重新设置左右节点。

定义一个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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_37841366/article/details/109138821