Leetcode - 156. 上下翻转二叉树

解题思路参考代码中的注释(代码未经过测试,因此可能会有错误,但思路是正确的):
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    /**
     * 已知条件:有一棵二叉树,该树上的任何一个节点的右子节点要么为空,要么是叶子节点且有兄弟节点
     * 题目要求:将这棵树进行上下翻转,返回新树的根
     *              1                     4
     *             / \                   / \
     *            2   3       =>        5   2
     *           / \                       / \
     *          4   5                     3   1
     * 解题思路:可以使用递归的方法
     *   - 先看节点2,反转后它的左子节点4变成了它的父节点,它的右子节点5变成了它的左兄弟节点
     *   - 再看节点1,反转后它的左子节点2变成了它的父节点,它的右子节点3变成了它的左兄弟节点
     */
    
    // 1. 将节点1传入该方法
    // 3. 将节点2传入该方法
    // 5. 将节点4传入该方法
    public TreeNode upsideDownBinaryTree(TreeNode root) {
        
        // 6. 直接返回节点4
        if (root == null || root.left == null) {
            return root;
        }
        
        // 2. 对节点1的左子节点进行翻转
        // 4. 对节点2的左子节点进行翻转
        // 7. ret代表节点4,而此时的root为节点2
        // a. ret代表节点4,而此时的root为节点1
        TreeNode ret = upsideDownBinaryTree(root.left);
        
        // 8. 修改节点2、节点4、节点5之间的关系
        // b. 修改节点1、节点2、节点3之间的关系
        root.left.left = root.right;
        root.left.right = root;
        root.left = null;
        root.right = null;
        
        // 9. 返回节点4
        // c. 返回节点4
        return ret;
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务