首页 > 其他分享 >上下翻转二叉树

上下翻转二叉树

时间:2023-03-30 21:22:47浏览次数:29  
标签:左子 right 右子 current 二叉树 上下 root 节点 翻转

给定一个二叉树的根节点 root,按照如下的方式上下翻转二叉树,并返回新的根节点。

1、原来的左子节点变成新的根节点

2、原来的根节点变成新的右子节点

3、原来的右子节点变成新的左子节点

上面的步骤都是逐层进行的,题目数据保证每个右节点都有一个同级节点(共享同一个父节点的左节点),且每个右节点不存在子节点(这个信息很关键)

整体流程

图示和题意,整个流程应逐层遍历:

1、如果当前根节点有左子节点,让左子节点的 left 指向 根节点

2、如果当前根节点有左子节点,让左子节点的right 指向根节点的右节点

3、逐层遍历,一直到 根节点 没有左子节点

思路分析

以图示为例,整体流程为 将 2 的 left 指向 1 , right 指向 3 ,但是,直接这么做,2  的子节点信息将会丢失。

所以需要换个思路:现在将注意力集中在根节点的左子树上:

 

 

这是不是就是一个单链表,链表的头结点是 1 ,同时每个结点的左结点的 next  指针指向的是下一个结点,因此就将这个问题转换成了链表的翻转问题,剩余的问题就是根节点右子树结点怎么连接。

再观察根节点的右子树,待连接的节点有3 和 5 。需要做的就是将 2 的 right 指向 3 ,同时 4 的 right 指向 5 。所以,将新 root 的 left 指向同层节点的右子节点即可完成剩余右子节点的链接。

递归和迭代

 

 1 public TreeNode upsideDownBinaryTree(TreeNode root) {
 2         if (root == null || root.left == null) return root;
 3         TreeNode prev = null;
 4         TreeNode current = root;
 5         TreeNode next = null;
 6         TreeNode lastRight = null;
 7         while (current != null) {
 8             next = current.left;
 9 
10             current.left = lastRight;
11             lastRight = current.right;
12 
13             current.right = prev;
14             prev = current;
15             current = next;
16         }
17         return prev;
18 }

 

         

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:左子,right,右子,current,二叉树,上下,root,节点,翻转
From: https://www.cnblogs.com/xiaoluo123/p/17274349.html

相关文章

  • JZ7 重建二叉树
     JZ7 重建二叉树方法一:递归做法前序的第一个结点就是根节点,而后在中序中将根节点的位置找出,根节点的左边是左子树,右边是右子树,而后再带入前序中分析,形成迭代。/***Definitionforbinarytree*structTreeNode{*intval;*TreeNode*left;*Tree......
  • LeetCode 559.二叉树的最大深度
    1.题目:给定一个N叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。示例1:输入:root=[1,null,3,2,4,null,5,6]输出:3来源:力扣(LeetCode)链接:https://leetcode.cn/problems/maximum......
  • LeetCode 222.完全二叉树的结点个数
    1.题目:给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~ 2h 个节点。示例1:输入:root=[1......
  • 两个链表相加,翻转链表
    将两个链表进行翻转,然后遍历链表进行相加翻转链表:reverseList(head){pre=null;//将遍历到的节点放在这个空节点的前面cur=head;while(cur!=null){temp =......
  • 08. 二叉树
    一、二叉树的定义  二叉树(T)是一个有穷的结点集合,这个集合可以为空,若不为空,则它是由根节点和称为其左子树\(T_{L}\)和右子树\(T_{R}\)的两个不相交的二叉树组成......
  • 树:剑指 Offer 07. 重建二叉树
    题目描述:输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例1: Input:pre......
  • LeetCode 101.对称二叉树
    1.题目:给你一个二叉树的根节点 root ,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true2.代码:方法一:递归实现/***Definitionforabinarytreenode.......
  • 对称的二叉树
    classSolution{public:booldfs(TreeNode*l,TreeNode*r){if(l==NULL&&r==NULL)returntrue;elseif(l&&r)re......
  • 二叉树的镜像
    classSolution{public:voidmirror(TreeNode*root){if(root==NULL)return;mirror(root->left);mirror(root->right);Tre......
  • V3.0(R2_2302) 前端上下文改造, 定位修改文件
    --iuap_yonbuilder_service库--查询包含'AppContext'关键字的函数文件SELECTe.description,e.source_flag,e.file_name,c.file_content,LOC......