day15 二叉树02

层序遍历 

        题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

思路:递归相当于直接操作resList数组,需要传递当前层数,将resList最新的出来,加入当前root的值,再递归传入左孩子和右孩子。

迭代需要队列,且两个while,外层while是queue不为空,内层while是queue的大小,提前获取queue的长度,然后进入内层循环,弹出队列元素将值加入到resList,然后再将该元素的左右孩子入队。

        

class Solution {
    public List<List<Integer>> resList = new ArrayList<List<Integer>>();

    public List<List<Integer>> levelOrder(TreeNode root) {
        //levelTraver01(root,0);
        levelTraver02(root);
        return resList;
    }

    //DFS--递归遍历
    //deep是层数
    public void levelTraver01(TreeNode root,Integer deep){
        if(root == null) return;
        deep++;
        //reslist是双层列表例:[[1],[2,3]],其外层的大小等于当前层数-1
        if(resList.size() < deep){
            List<Integer> item = new ArrayList<Integer>();
            resList.add(item);//加入空列表
        }
        resList.get(deep-1).add(root.val);

        levelTraver01(root.left,deep);
        levelTraver01(root.right,deep);
    }

    //DFS--迭代方式--借助队列
    public void levelTraver02(TreeNode node){
        if(node == null) return;
        
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(node);

        while(!queue.isEmpty()){
            List<Integer> itemList = new ArrayList<Integer>();
            int len = queue.size();

            while(len > 0){
                TreeNode tmpNode = queue.poll();
                itemList.add(tmpNode.val);

                if(tmpNode.left != null) queue.offer(tmpNode.left);
                if(tmpNode.right != null) queue.offer(tmpNode.right);
                len--;
            }

            resList.add(itemList);
        }
    }
}

2题目链接:107. 二叉树的层序遍历 II - 力扣(LeetCode)

思路:反转外层列表

class Solution {
    public List<List<Integer>> resList = new ArrayList<List<Integer>>();
    
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        TreeNode node = root;
        List<List<Integer>> result = new ArrayList<>();

        if(node == null) return result;
        
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(node);

        while(!queue.isEmpty()){
            List<Integer> itemList = new ArrayList<Integer>();
            int len = queue.size();

            while(len > 0){
                TreeNode tmpNode = queue.poll();
                itemList.add(tmpNode.val);

                if(tmpNode.left != null) queue.offer(tmpNode.left);
                if(tmpNode.right != null) queue.offer(tmpNode.right);
                len--;
            }

            resList.add(itemList);
        }

        for(int i = resList.size()-1; i >= 0; i--){
            result.add(resList.get(i));
        }

        return result;
    }
}

3题目链接:199. 二叉树的右视图 - 力扣(LeetCode)

思路:每层的最后一个值

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Deque<TreeNode> que = new LinkedList<>();

        if (root == null) {
            return list;
        }

        que.offerLast(root);
        while (!que.isEmpty()) {
            int levelSize = que.size();

            for (int i = 0; i < levelSize; i++) {
                TreeNode poll = que.pollFirst();

                if (poll.left != null) {
                    que.addLast(poll.left);
                }
                if (poll.right != null) {
                    que.addLast(poll.right);
                }

                //i是最后一个时才加入list
                if (i == levelSize - 1) {
                    list.add(poll.val);
                }
            }
        }

        return list;
    }
}

4题目链接:637. 二叉树的层平均值 - 力扣(LeetCode)

思路:内层while进去前会统计当前queue的size,在内层循环中计算sum,循环结束时计算平均值放入数组中

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> list = new ArrayList<>();
        Deque<TreeNode> que = new LinkedList<>();

        if(root == null) return list;

        que.offerLast(root);

        while(!que.isEmpty()){
            int levelSize = que.size();
            Double sum = 0.0;
            for(int i = 0;i<levelSize;i++){
                TreeNode poll = que.pollFirst();
                sum += poll.val;
                if(poll.left != null) que.addLast(poll.left);
                if(poll.right != null) que.addLast(poll.right);
            }
            list.add(sum/levelSize);
        }
        return list;
    }
}

5题目链接:429. N 叉树的层序遍历 - 力扣(LeetCode)

思路:左右孩子改成孩子遍历

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> list = new ArrayList<>();
        Deque<Node> que = new LinkedList<>();

        if(root == null){
            return list;
        }

        que.offerLast(root);

        while(!que.isEmpty()){
            int levelSize = que.size();
            List<Integer> levelList = new ArrayList<>();
            for(int i=0; i < levelSize; i++){
                Node poll = que.pollFirst();
                levelList.add(poll.val);
                List<Node> children =poll.children;
                if(children != null && children.size() != 0){
                    for(Node child : children){
                        if(child != null)
                            que.offerLast(child);
                    }
                }
            }
            list.add(levelList);
        }
        return list;
        
    }
}

6题目链接:515. 在每个树行中找最大值 - 力扣(LeetCode)

class Solution {
    public List<Integer> largestValues(TreeNode root) {
        if(root == null){
            return Collections.emptyList();
        }
        List<Integer> result = new ArrayList();
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
            int max = Integer.MIN_VALUE;
            for(int i = queue.size(); i > 0; i--){
               TreeNode node = queue.poll();
               max = Math.max(max, node.val);
               if(node.left != null) queue.offer(node.left);
               if(node.right != null) queue.offer(node.right);
            }
            result.add(max);
        }
        return result;
    }
}

7题目链接:116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

思路:队列先进先出,双指针法,右孩子先进先出,指向右孩子

问题:cur和pre最初要指向同一个节点,不能是Node cur = que.poll();Node pre = que.poll();

class Solution {
    public Node connect(Node root) {
        Queue<Node> que = new LinkedList<Node>();
        if(root == null) return root;

        que.add(root);
        while(que.size() != 0){
            int size = que.size();

            Node cur = que.poll();
            Node pre = cur;
            for(int i = 0; i<size; i++){
                if(i != 0){
                    cur = que.poll();
                    cur.next = pre;
                    pre = cur;
                }
                if(cur.right != null) que.add(cur.right);
                if(cur.left != null) que.add(cur.left);
            }

        }
        return root;
    }
}

8题目链接:117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode)

和上题一样,区别就是不是完全二叉树了

class Solution {
    public Node connect(Node root) {
        Queue<Node> que = new LinkedList<Node>();
        if(root == null) return root;

        que.add(root);
        while(que.size() != 0){
            int size = que.size();

            Node cur = que.poll();
            Node pre = cur;
            for(int i = 0; i<size; i++){
                if(i != 0){
                    cur = que.poll();
                    cur.next = pre;
                    pre = cur;
                }
                if(cur.right != null) que.add(cur.right);
                if(cur.left != null) que.add(cur.left);
            }

        }
        return root;
    }
}

9题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)

思路:最大深度等于层数

class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null) return 0;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        int depth = 0;
        while(!que.isEmpty()){
            int size = que.size();
            while(size > 0){
                TreeNode node = que.poll();
                if(node.left != null)   que.offer(node.left);
                if(node.right != null)  que .offer(node.right);
                size--;

            }
            depth++;
        }

        return depth;
    }
}

10题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)

思路:最小深度等于左右孩子为空的节点所在层数

class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        Queue<TreeNode> que = new LinkedList<>();
        int depth = 1;
        que.offer(root);
        while(!que.isEmpty()){
            int size = que.size();
            TreeNode node = que.poll();
            for(int i = 0;i < size; i++){
                if(node.left == null && node.right == null) return depth;
                if(node.left != null) que.offer(node.left);
                if(node.right !=null) que.offer(node.right);
            }
            depth++;
        }
        return depth;
    }
}

226.翻转二叉树

题目链接:226. 翻转二叉树 - 力扣(LeetCode)

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null)    return root;
        swap(root);
        invertTree(root.left);
        invertTree(root.right); 
        return root;
    }

    public void swap(TreeNode root){
        TreeNode node = root.left;
        root.left = root.right;
        root.right = node;
        return ;
    } 
}

总结:交换左右孩子就行,但是中序遍历不行,会重复交换左孩子,所以要进入两次左孩子,而不是进入左孩子;进入右孩子

101. 对称二叉树

题目链接:101. 对称二叉树 - 力扣(LeetCode)

思路:比较外侧,再比较内侧,两个左右孩子一起传进去

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left,root.right);
    }

    public boolean compare(TreeNode left, TreeNode right){
        if(left == null && right == null)   return true;
        if(left != null && right == null)   return false;
        if(left == null && right != null)   return false;
        if(left.val != right.val)   return false;
        boolean outSide = compare(left.left,right.right);
        boolean inSide = compare(left.right,right.left);
        return outSide && inSide;
    }
}

### 回答1: rtmpdump是一个开源的命令行工具,用于从流媒体服务器上下载或录制RTMP流(Real-Time Messaging Protocol)。vc工程是指使用VC++编写的工程项目。将两者结合起来,意味着在VC++环境下使用rtmpdump工具进行流媒体下载或录制。 要在VC++中使用rtmpdump工具,首先需要下载并安装rtmpdump源代码。然后在VC++项目中添加rtmpdump的相关文件,并在代码中引用相关的头文件。接下来,就可以使用rtmpdump提供的函数来实现对RTMP流的下载或录制。 具体而言,可以使用rtmpdump的rtmpdump()函数指定要下载或录制的RTMP流的URL,并设置保存的文件路径。通过调用该函数,rtmpdump将连接到流媒体服务器并获取流媒体数据,并将其写入指定的文件中。在下载或录制过程中,还可以使用rtmpdump的其他函数来处理数据流,例如解密、分段等操作。 在VC++中使用rtmpdump工程可以为流媒体下载或录制提供更灵活和定制化的功能。通过使用VC++的编程特性,可以进行更高级的数据处理和界面设计,实现更复杂的功能需求。同时,rtmpdump的开源性质也使得用户能够根据自己的需求对其进行修改和扩展。 总之,通过在VC++中使用rtmpdump工程,可以方便地实现对RTMP流的下载或录制,并根据需要进行定制化的功能扩展。这为开发者提供了更大的灵活性和自由度,以满足不同的流媒体处理需求。 ### 回答2: rtmpdump是一款用于从RTMP流媒体服务器下载或录制音频/视频内容的开源工具。vc工程是指使用Visual C++编程语言和开发环境创建的软件项目。 要创建一个rtmpdump的vc工程,首先需要下载rtmpdump的源代码,然后使用Visual C++打开相应的工程文件。接下来需要配置工程的编译环境,确保所需的头文件和库文件路径正确。 在工程中,会有一些源代码文件,这些文件负责实现rtmpdump的各种功能,例如建立与RTMP服务器的连接、发送请求、接收数据、数据解析等等。这些文件会被编译成可执行的二进制文件。 在编译期间可能会遇到一些依赖项问题,例如需要额外链接一些库文件以支持某些功能。开发人员需要根据编译过程中的错误信息,对工程进行适当的配置和调整,以确保成功编译。 一旦vc工程成功编译完成,就可以生成一个可执行文件,该文件可以在命令行中运行。通过指定RTMP服务器的URL和相关参数,可以让rtmpdump工具连接到服务器并下载或录制所需的音频/视频内容。 总的来说,创建一个rtmpdump的vc工程需要下载源代码、配置编译环境、解决依赖项问题,并根据需要添加自定义功能。通过编译和运行工程生成的可执行文件,就能实现从RTMP流媒体服务器下载或录制音频/视频内容的操作。 ### 回答3: rtmpdump是一个用于下载和保存RTMP流的工具。它提供了用于处理RTMP协议的源代码,可以自定义编译和构建,获得一个可以在不同平台上运行的RTMP下载工具。 RTMP是一种用于流媒体传输的协议,它是Adobe公司开发的一种实时通信协议,常用于视频直播、在线游戏和音频通信等领域。rtmpdump工具可以连接到RTMP服务器,读取和接收RTMP流,并将其保存为本地文件。 vc工程是指使用Visual C++编译器创建的工程。通过将rtmpdump的源代码加入到Visual C++工程中,我们可以使用VC++的功能和特性来构建和调试rtmpdump工具。这样,我们就可以根据自己的需求进行修改和定制,使其能够更好地满足我们的需求。 在vc工程中,我们可以使用rtmpdump的源代码来构建一个命令行界面的工具,以便用户可以通过命令行输入相关参数来下载RTMP流。我们可以利用Visual C++的调试功能来排查和修复可能存在的问题,提高工具的稳定性和性能。 除了在vc工程中进行开发和调试,rtmpdump还可以在不同的平台上进行编译和构建,如Linux、Mac和Android等。这使得rtmpdump工具具有更广泛的适用性和可移植性。 总结来说,rtmpdump vc工程是指使用Visual C++编译器创建的工程,并集成了rtmpdump的源代码,使其能够在Windows平台上运行和定制化,从而实现对RTMP流进行下载和保存的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林中晚霞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值