LeetCode 之 Binary Tree Level Order Traversal II

题目链接:Binary Tree Level Order Traversal II
这虽然是道”easy”的题,做的时候整个思路有不是很复杂,但是编写代码的时候,主要是对list还不够熟练,出现了很多问题,导致做了很久才做出来。
思路:分别得出左右子树对应的list,然后合并成整个树的list,得出的list的顺序需要反转。其中利用到树的深度。
代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
*/
class Solution {
    //对list进行反转
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> first = new ArrayList<>();    
        first =  levelOrderBottomreverse(root);
        Collections.reverse(first);
        return first; 
    }

     public List<List<Integer>> levelOrderBottomreverse(TreeNode root) {
        int depth = maxDepth(root);
        List<List<Integer>> re = new ArrayList<>(); 
        if(root==null)
            return re;
        int depthl = maxDepth(root.left);
        int depthr = maxDepth(root.right);
        ArrayList<Integer> sub = new ArrayList<Integer>();
        sub.add(root.val);
        re.add(sub);
        List<List<Integer>> rel =         levelOrderBottomreverse(root.left);
        List<List<Integer>> rer = levelOrderBottomreverse(root.right);
        for(int i=1;i<depth;i++){
            sub = new ArrayList<Integer>();
            if(i<=depthl)
                sub.addAll(rel.get(i-1));
            if(i<=depthr)
                sub.addAll(rer.get(i-1)); 
            re.add(sub);
        }
        return re;
        }

  //计算树的深度
  public int maxDepth(TreeNode root) {
        int maxdepth = 0;
        if(root==null)
            return 0;
        int maxl = maxDepth(root.left);
        int maxr = maxDepth(root.right);
        maxdepth = 1 + ((maxl>maxr)? maxl:maxr);
        return maxdepth;

    }
}

其中初始化定义List<List<Integer>>时,需要注意
初始化过程是:

List<List<Integer>> list = new ArrayList<List<Integer>>();
//或者Java 1.7以后
List<List<Integer>> list = new ArrayList<>();

同时,查看了其他人的解题思路:(今天有点累了,明天补上)

在计算机科学与编程领域中,“reverse”、“文件操作”和“数据反转”这些术语可以涵盖多种不同的含义与应用场景。以下是对这些术语可能含义的专业解析: ### 三、文件操作中的“reverse”操作 在文件操作中,"reverse" 通常指对文件内容进行反转处理,即将文件中的字节流或字符流按照逆序方式进行读取或写入。例如,一个文本文件的内容是 `"Hello World"`,经过反转后会变成 `"dlroW olleH"`。这种操作常用于调试、日志分析以及特定格式的文件转换。实现方式通常包括将文件内容读入内存后使用 `reverse()` 方法进行处理,或者逐字节读取并反向写入新文件。 ### 四、数据结构中的“reverse”机制 在数据结构层面,“数据反转”指的是对线性结构(如数组、链表、栈、队列)中的元素顺序进行反转的操作。例如,在 Python 中可以使用 `list.reverse()` 方法对列表进行原地反转,而 `reversed()` 函数则返回一个迭代器,不会修改原始数据[^1]。对于链表结构,通常需要手动实现反转逻辑,例如通过遍历节点并调整指针方向来完成单链表的反转。以下是一个经典的单链表反转实现: ```java class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode nextTemp = curr.next; curr.next = prev; prev = curr; curr = nextTemp; } return prev; } } ``` 该实现通过逐个节点调整指针方向,最终完成整个链表的反转[^4]。 ### 五、字符串处理中的反转操作 在字符串处理中,反转操作通常涉及将字符串转换为字符数组,然后调用数组的反转方法。例如在 C# 中,可以使用 `ToCharArray()` 将字符串转为字符数组,再通过 `Array.Reverse()` 实现反转,并最终构造新的字符串: ```csharp string originalString = "C# String Reversal"; char[] charArray = originalString.ToCharArray(); Array.Reverse(charArray); string reversedString = new string(charArray); Console.WriteLine($"Reversed String: {reversedString}"); ``` 该方法适用于字符串不可变的语言(如 C# 和 Java),通过中间数组实现高效反转[^2]。 ### 六、递归与树结构中的“reverse”类操作 在树结构中,“reverse” 的含义可能不是直接的元素顺序反转,而是指一种对遍历顺序的调整。例如在二叉树的遍历中,后序遍历可以被视为一种“逆向”遍历,而某些问题要求对子树进行镜像翻转,这在实现上可以视为一种广义的“reverse”操作。例如以下递归代码展示了对二叉树节点的访问顺序: ```c void Traversal(BinTree BT) { Traversal(BT->Left); Traversal(BT->Right); } ``` 虽然此代码未直接反转结构,但其递归顺序体现了对数据结构访问方向的控制[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值