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

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

相关推荐
CoovallyAIHub29 分钟前
避开算力坑!无人机桥梁检测场景下YOLO模型选型指南
深度学习·算法·计算机视觉
YouQian77233 分钟前
问题 C: 字符串匹配
c语言·数据结构·算法
yanxing.D39 分钟前
408——数据结构(第二章 线性表)
数据结构·算法
艾莉丝努力练剑1 小时前
【LeetCode&数据结构】二叉树的应用(二)——二叉树的前序遍历问题、二叉树的中序遍历问题、二叉树的后序遍历问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
YuTaoShao1 小时前
【LeetCode 热题 100】51. N 皇后——回溯
java·算法·leetcode·职场和发展
2 小时前
3D碰撞检测系统 基于SAT算法+Burst优化(Unity)
算法·3d·unity·c#·游戏引擎·sat
Tony沈哲2 小时前
OpenCV 图像调色优化实录:基于图像金字塔的 RAW / HEIC 文件加载与调色实践
opencv·算法
我就是全世界2 小时前
Faiss中L2欧式距离与余弦相似度:究竟该如何选择?
算法·faiss
boyedu2 小时前
比特币运行机制全解析:区块链、共识算法与数字黄金的未来挑战
算法·区块链·共识算法·数字货币·加密货币
KarrySmile3 小时前
Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
算法·链表·面试·双指针法·虚拟头结点·环形链表