代码随想录算法训练营第十一天

LeetCode/卡码网题目:

  • [144. 二叉树的前序遍历](#144. 二叉树的前序遍历)
  • [94. 二叉树的中序遍历](#94. 二叉树的中序遍历)
  • [145. 二叉树的后序遍历](#145. 二叉树的后序遍历)
  • [102. 二叉树的层序遍历](#102. 二叉树的层序遍历)
  • 107.二叉树的层次遍历II
  • [199. 二叉树的右视图](#199. 二叉树的右视图)
  • [637. 二叉树的层平均值](#637. 二叉树的层平均值)
  • [429. N 叉树的层序遍历](#429. N 叉树的层序遍历)
  • [515. 在每个树行中找最大值](#515. 在每个树行中找最大值)
  • [116. 填充每个节点的下一个右侧节点指针](#116. 填充每个节点的下一个右侧节点指针)
  • [117. 填充每个节点的下一个右侧节点指针 II](#117. 填充每个节点的下一个右侧节点指针 II)
  • [104. 二叉树的最大深度](#104. 二叉树的最大深度)
  • [111. 二叉树的最小深度](#111. 二叉树的最小深度)

其他:

今日总结
往期打卡


144. 二叉树的前序遍历

跳转:

问题:

思路:

递归,迭代,空指针标记模拟递归

代码(递归):

java 复制代码
void handle(TreeNode root,List<Integer> list){
        if(root == null) return;
        list.add(root.val);
        handle(root.left,list); 
        handle(root.right,list);
    }
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        handle(root,ans);
        return ans;
    }

代码(迭代):

java 复制代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        if(root==null) return new ArrayList<>();
       Stack<TreeNode> stack = new Stack<>();
       stack.push(root);
       List<Integer> ans = new ArrayList<>();
       while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            ans.add(tmp.val);
            if(tmp.right!=null){
                stack.push(tmp.right);
            }
             if(tmp.left!=null){
                stack.push(tmp.left);
             } 
       }
       return ans;
    }
}

代码(空指针标记模拟递归):

java 复制代码
public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root==null) return ans;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            if(tmp==null){
                tmp = stack.pop();
                ans.add(tmp.val);
            }else{
                if(tmp.right!=null) stack.add(tmp.right);
                if(tmp.left!=null) stack.add(tmp.left);
                stack.add(tmp);
                stack.add(null);
            }
        }
        return ans;
    }

94. 二叉树的中序遍历

跳转:

问题:

思路:

递归,迭代,空指针标记模拟递归

代码(递归):

java 复制代码
void handle(TreeNode root,List<Integer> list){
        if(root == null) return;
        handle(root.left,list);
        list.add(root.val);
        handle(root.right,list);
    }
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        handle(root,ans);
        return ans;
    }

代码(迭代):

java 复制代码
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root==null) return ans;
        Stack<TreeNode> stack = new Stack<>();
        while(root!=null||!stack.isEmpty()){
            if(root!=null){
                stack.push(root);
                root = root.left;
            }else{
                root = stack.pop();
                ans.add(root.val);
                root = root.right;
            }
        }
        return ans;
    }
}

代码(空指针标记模拟递归):

java 复制代码
public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root==null) return ans;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            if(tmp==null){
                tmp = stack.pop();
                ans.add(tmp.val);
            }else{
                if(tmp.right!=null) stack.add(tmp.right);
                stack.add(tmp);
                stack.add(null);
                if(tmp.left!=null) stack.add(tmp.left);
            }
        }
        return ans;
    }

145. 二叉树的后序遍历

跳转:

问题:

思路:

递归,迭代,空指针标记模拟递归

代码(递归):

java 复制代码
void handle(TreeNode root,List<Integer> list){
        if(root == null) return;
        handle(root.left,list);
        handle(root.right,list);
        list.add(root.val);
    }
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        handle(root,ans);
        return ans;
    }

代码(迭代):

java 复制代码
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if (root == null)
            return ans;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            ans.add(tmp.val);
            if(tmp.left!=null) stack.add(tmp.left);
            if(tmp.right!=null) stack.add(tmp.right);
        }
        Collections.reverse(ans);
        return ans;
    }

代码(空指针标记模拟递归):

java 复制代码
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if (root == null)
            return ans;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            if(tmp==null){
                tmp = stack.pop();
                ans.add(tmp.val);
            }else{
                stack.push(tmp);
                stack.push(null);
                if(tmp.right!=null) stack.push(tmp.right);
                if(tmp.left!=null) stack.push(tmp.left);
            }
        }
        return ans;
    }

102. 二叉树的层序遍历

跳转:

问题

思路:

利用队列层序遍历

代码:

java 复制代码
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        if(root==null) return ans;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            List<Integer> list = new ArrayList<>();
            int len = queue.size();
            while(len-->0){
                TreeNode tmp = queue.poll();
                list.add(tmp.val);
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);

            }
            ans.add(list);
        }
        return ans;

    }
}

107.二叉树的层次遍历II

跳转:

问题

代码:

java 复制代码
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        if(root==null) return ans;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            List<Integer> list = new ArrayList<>();
            int len = queue.size();
            while(len-->0){
                TreeNode tmp = queue.poll();
                list.add(tmp.val);
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);

            }
            ans.add(list);
        }
        Collections.reverse(ans);
        return ans;
    }
}

199. 二叉树的右视图

跳转:

问题

代码:

java 复制代码
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root==null) return ans;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            int right=0;
            int len = queue.size();
            for(int i=0;i<len;i++){
                TreeNode tmp = queue.poll();
                right = tmp.val;
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);

            }
            if(len>0)
            ans.add(right);
        }
        return ans;
    }
}

637. 二叉树的层平均值

跳转:

问题

代码:

java 复制代码
class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> ans = new ArrayList<>();
        if(root==null) return ans;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            Double avg=0.0;
            int len = queue.size();
            for(int i=0;i<len;i++){
                TreeNode tmp = queue.poll();
                avg += tmp.val;
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);

            }
            if(len!=0)
            ans.add(avg/len);
        }
        return ans;
    }
}

429. N 叉树的层序遍历

跳转:

问题

代码:

java 复制代码
class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> ans = new ArrayList<>();
        if(root==null) return ans;
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            List<Integer> list = new ArrayList<>();
            int len = queue.size();
            while(len-->0){
                Node tmp = queue.poll();
                list.add(tmp.val);
                for(Node child:tmp.children){
                    queue.add(child);
                }

            }
            ans.add(list);
        }
        return ans;
    }
}

515. 在每个树行中找最大值

跳转:

问题

代码:

java 复制代码
class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root==null) return ans;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            int max=Integer.MIN_VALUE;
            int len = queue.size();
            for(int i=0;i<len;i++){
                TreeNode tmp = queue.poll();
                max = Math.max(max,tmp.val);
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);

            }
            if(len>0)
            ans.add(max);
        }
        return ans;
    }
}

116. 填充每个节点的下一个右侧节点指针

跳转:

问题

代码:

java 复制代码
class Solution {
    public Node connect(Node root) {
        if(root==null) return null;
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            int len = queue.size();
            for(int i=0;i<len;i++){
                Node tmp = queue.poll();
                if(i==len-1) tmp.next = null;
                else tmp.next = queue.peek();
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);

            }
        }
        return root;
    }
}

117. 填充每个节点的下一个右侧节点指针 II

跳转:

问题

代码:

java 复制代码
class Solution {
    public Node connect(Node root) {
        if(root==null) return null;
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            int len = queue.size();
            for(int i=0;i<len;i++){
                Node tmp = queue.poll();
                if(i==len-1) tmp.next = null;
                else tmp.next = queue.peek();
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);
            }
        }
        return root;
    }
}

104. 二叉树的最大深度

跳转:

问题

代码:

java 复制代码
class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int deep = 0;
        while(!queue.isEmpty()){
            int len = queue.size();
            deep ++;
            for(int i=0;i<len;i++){
                TreeNode tmp = queue.poll();
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);
            }
        }
        return deep;
    }
}

111. 二叉树的最小深度

跳转:

问题

代码:

java 复制代码
class Solution {
    public int minDepth(TreeNode root) {
        if(root==null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int deep = 0;
        while(!queue.isEmpty()){
            int len = queue.size();
            deep ++;
            for(int i=0;i<len;i++){
                TreeNode tmp = queue.poll();
                if(tmp.left!=null) queue.add(tmp.left);
                if(tmp.right!=null) queue.add(tmp.right);
                if(tmp.left==null&&tmp.right==null) return deep;
            }
        }
        return deep;
    }
}

总结

练习了递归遍历和层序遍历,后面都是层序遍历的题,所以每题改动不大

为什么如此匆忙,因为电脑快没电了

建议去力扣自己练习,使用效果更佳

往期打卡

代码随想录算法训练营第一天

代码随想录算法训练营第二天

代码随想录算法训练营第三天

代码随想录算法训练营第四天

代码随想录算法训练营周末一

代码随想录算法训练营第五天

代码随想录算法训练营第六天

代码随想录算法训练营第七天

代码随想录算法训练营第八天

代码随想录算法训练营第九天

代码随想录算法训练营第十天

代码随想录算法训练营周末二

*[102. 二叉树的层序遍历]: LeetCode
*[117. 填充每个节点的下一个右侧节点指针 II]: LeetCode
*[107. 二叉树的层序遍历 II]: LeetCode
*[144. 二叉树的前序遍历]: LeetCode
*[111. 二叉树的最小深度]: LeetCode
*[637. 二叉树的层平均值]: LeetCode
*[515. 在每个树行中找最大值]: LeetCode
*[94. 二叉树的中序遍历]: LeetCode
*[429. N 叉树的层序遍历]: LeetCode
*[116. 填充每个节点的下一个右侧节点指针]: LeetCode
*[199. 二叉树的右视图]: LeetCode
*[145. 二叉树的后序遍历]: LeetCode
*[104. 二叉树的最大深度]: LeetCode

相关推荐
CoovallyAIHub几秒前
OpenClaw一脚踩碎传统CV?机器终于不再只是看世界
深度学习·算法·计算机视觉
CoovallyAIHub16 分钟前
仅凭单目相机实现3D锥桶定位?UNet-RKNet破解自动驾驶锥桶检测难题
深度学习·算法·计算机视觉
zone773917 分钟前
002:RAG 入门-LangChain 读取文本
后端·算法·面试
得物技术1 小时前
得物社区搜推公式融合调参框架-加乘树3.0实战
算法
会员源码网20 小时前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing21 小时前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader1 天前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱1 天前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8971 天前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮2 天前
AI视觉连载8:传统 CV 之边缘检测
算法