C++实现LeetCode(156.二叉树的上下颠倒)

 更新时间:2021年07月30日 14:20:25   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(156.二叉树的上下颠倒),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 156. Binary Tree Upside Down 二叉树的上下颠倒

Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that shares the same parent node) or empty, flip it upside down and turn it into a tree where the original right nodes turned into left leaf nodes. Return the new root.

Example:

Input: [1,2,3,4,5]

    1
/ \
2   3
/ \
4   5

Output: return the root of the binary tree [4,5,2,#,#,3,1]

   4
/ \
5   2
/ \
3   1  

Clarification:

Confused what [4,5,2,#,#,3,1] means? Read more below on how binary tree is serialized on OJ.

The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

Here's an example:

   1
/ \
2   3
/
4
\
5

The above binary tree is serialized as [1,2,3,#,#,4,#,#,5].

这道题让我们把一棵二叉树上下颠倒一下,而且限制了右节点要么为空要么一定会有对应的左节点。上下颠倒后原来二叉树的最左子节点变成了根节点,其对应的右节点变成了其左子节点,其父节点变成了其右子节点,相当于顺时针旋转了一下。对于一般树的题都会有迭代和递归两种解法,这道题也不例外,先来看看递归的解法。对于一个根节点来说,目标是将其左子节点变为根节点,右子节点变为左子节点,原根节点变为右子节点,首先判断这个根节点是否存在,且其有没有左子节点,如果不满足这两个条件的话,直接返回即可,不需要翻转操作。那么不停的对左子节点调用递归函数,直到到达最左子节点开始翻转,翻转好最左子节点后,开始回到上一个左子节点继续翻转即可,直至翻转完整棵树,参见代码如下:

解法一:

class Solution {
public:
    TreeNode *upsideDownBinaryTree(TreeNode *root) {
        if (!root || !root->left) return root;
        TreeNode *l = root->left, *r = root->right;
        TreeNode *res = upsideDownBinaryTree(l);
        l->left = r;
        l->right = root;
        root->left = NULL;
        root->right = NULL;
        return res;
    }
};

下面我们来看迭代的方法,和递归方法相反的时,这个是从上往下开始翻转,直至翻转到最左子节点,参见代码如下:

解法二:

class Solution {
public:
    TreeNode *upsideDownBinaryTree(TreeNode *root) {
        TreeNode *cur = root, *pre = NULL, *next = NULL, *tmp = NULL;
        while (cur) {
            next = cur->left;
            cur->left = tmp;
            tmp = cur->right;
            cur->right = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/156

类似题目:

Reverse Linked List

参考资料:

https://leetcode.com/problems/binary-tree-upside-down/

https://leetcode.com/problems/binary-tree-upside-down/discuss/49412/Clean-Java-solution

https://leetcode.com/problems/binary-tree-upside-down/discuss/49432/Easy-O(n)-iteration-solution-Java

https://leetcode.com/problems/binary-tree-upside-down/discuss/49406/Java-recursive-(O(logn)-space)-and-iterative-solutions-(O(1)-space)-with-explanation-and-figure

到此这篇关于C++实现LeetCode(156.二叉树的上下颠倒)的文章就介绍到这了,更多相关C++实现二叉树的上下颠倒内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 迷宫游戏控制台版C++代码

    迷宫游戏控制台版C++代码

    这篇文章主要为大家详细介绍了迷宫游戏控制台版C++代码,可以调整大小的迷宫游戏,给定迷宫的入口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C语言之复杂链表的复制方法(图示详解)

    C语言之复杂链表的复制方法(图示详解)

    下面小编就为大家带来一篇C语言之复杂链表的复制方法(图示详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • C++ 二维数组参数传递的实现方法

    C++ 二维数组参数传递的实现方法

    这篇文章主要介绍了C++ 二维数组参数传递的实现方法的相关资料,这里提供三种方法帮助大家实现这样的功能,需要的朋友可以参考下
    2017-08-08
  • C/C++指针与内存管理图文详解

    C/C++指针与内存管理图文详解

    这篇文章主要为大家详细介绍了C/C++指针与内存管理,使用文图并叙的方式,文中图片介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Visual Studio 2019 Professional 激活方法详解

    Visual Studio 2019 Professional 激活方法详解

    这篇文章主要介绍了Visual Studio 2019 Professional 激活方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 浅谈#ifndef,#define,#endif的作用和用法

    浅谈#ifndef,#define,#endif的作用和用法

    下面小编就为大家带来一篇浅谈#ifndef,#define,#endif的作用和用法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言数据结构之单向链表详解

    C语言数据结构之单向链表详解

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。本文将为大家详细讲讲单向链表的实现与使用,需要的可以参考一下
    2022-08-08
  • C语言经典指针笔试题详解

    C语言经典指针笔试题详解

    今天博主来讲解4道经典的指针笔试题,很多朋友没有深刻理解函数传参知识都会在这些题目上出错,下面话不多说,我们开始
    2021-10-10
  • C/C++中提高查找速度的小技巧

    C/C++中提高查找速度的小技巧

    这篇文章主要给大家介绍了C/C++中提高数组中查找某个元素或者字符串中查找某个字符效率的小技巧,提高速度对我们日常开发来说还是很有用的,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • C++11中初始化列表initializer lists的使用方法

    C++11中初始化列表initializer lists的使用方法

    C++11引入了初始化列表来初始化变量和对象,自定义类型,如果想用初始化列表就要包含initializer_list头文件
    2021-09-09

最新评论