leetcode打卡-二叉树I

目录

102. 二叉树的层序遍历

429. N 叉树的层序遍历

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

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

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

104. 二叉树的最大深度

111. 二叉树的最小深度

 199. 二叉树的右视图

637. 二叉树的层平均值

107. 二叉树的层序遍历 II

100. 相同的树

 572. 另一棵树的子树

 94. 二叉树的中序遍历

145. 二叉树的后序遍历

 144. 二叉树的前序遍历

101. 对称二叉树

222. 完全二叉树的节点个数

 226. 翻转二叉树


102. 二叉树的层序遍历

leetcode题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal

leetcode AC记录:

思路:使用队列存放每一层的节点, 循环取每一层节点前使用当前队列大小当作每层节点个数。

代码如下:

public List<List<Integer>> levelOrder(TreeNode root) {
        Deque<TreeNode> queue = new LinkedList<>();
        if(root == null) {
            return new ArrayList<>();
        }

        queue.offer(root);

        List<List<Integer>> res = new ArrayList<>();
        while(!queue.isEmpty()) {
            List<Integer> list = new ArrayList<>(queue.size());
            int size = queue.size();
            for(int i = 0;i < size;i++) {
                TreeNode node = queue.pollFirst();
                list.add(node.val);
                if(node.left != null) {
                    queue.offer(node.left);
                }

                if(node.right != null) {
                    queue.offer(node.right);
                }
            }

            res.add(list);
        }

        return res;
    }

429. N 叉树的层序遍历

leetcode题目链接:https://leetcode.cn/problems/n-ary-tree-level-order-traversal

leetcode AC记录:

 代码如下:

public List<List<Integer>> levelOrder(Node root) {
        if(root == null) {
            return new ArrayList<>(0);
        }

        List<List<Integer>> res = new ArrayList<>(16);
        Deque<Node> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int size = queue.size();
            List<Integer> list = new ArrayList<>(size);
            for(int i = 0;i < size;i++) {
                Node node = queue.pollFirst();
                list.add(node.val);
                if(node.children != null && node.children.size() > 0) {
                    for(Node child : node.children) {
                        queue.offer(child);
                    }
                }
            }
            res.add(list);
        }
        return res;
    }

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

leetcode题目链接:https://leetcode.cn/problems/find-largest-value-in-each-tree-row

leetcode AC记录:

代码如下:

public List<Integer> largestValues(TreeNode root) {
        if(root == null) {
            return new ArrayList<>(0);
        }

        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        List<Integer> res = new ArrayList<>(16);
        int max;
        while(!queue.isEmpty()) {
            int size = queue.size();
            max = Integer.MIN_VALUE;
            for(int i = 0;i < size;i++) {
                TreeNode node = queue.pollFirst();
                if(node.val > max) {
                    max = node.val;
                }

                if(node.left != null) {
                    queue.offer(node.left);
                }

                if(node.right != null) {
                    queue.offer(node.right);
                }
            }
            res.add(max);
        }

        return res;
    }

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

leetcode题目链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node

 leetcode AC记录:

思路:层序遍历,使用队列遍历每层,节点下一个指针指向队列中的下一个元素。

代码如下:

public Node connect(Node root) {
        if(root == null) {
            return null;
        }

        Deque<Node> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int size = queue.size();
            int index = 0;
            while(index < size) {
                Node node = queue.pollFirst();
                if(index + 1 < size) {
                    node.next = queue.peek();
                } else {
                    node.next = null;
                }
                
                if(node.left != null) {
                    queue.offer(node.left);
                }

                if(node.right != null) {
                    queue.offer(node.right);
                }
                index++;
            }
        }

        return root;
    }

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

leetcode题目链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii

leetcode AC记录:

代码如下:

 public Node connect(Node root) {
        if(root == null) {
            return null;
        }

        Deque<Node> queue = new LinkedList<>();
        queue.offer(root);

        while(!queue.isEmpty()) {
            int size = queue.size();
            int index = 0;
            while(index < size) {
                Node node = queue.pollFirst();
                if(index + 1 < size) {
                    node.next = queue.peek();
                }

                if(node.left != null) {
                    queue.offer(node.left);
                }

                if(node.right != null) {
                    queue.offer(node.right);
                }
                index++;
            }
        }
        return root;
    }

104. 二叉树的最大深度

leetcode题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree

leetcode AC记录:

思路:层序遍历,记录层数。

代码如下:

public int maxDepth(TreeNode root) {
        if(root == null) {
            return 0;
        }

        int res = 0;
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int size = queue.size();
            int index = 0;
            while(index < size) {
                TreeNode node = queue.pollFirst();
                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
                index++;
            }
            res++;
        }
        return res;
    }

111. 二叉树的最小深度

leetcode题目链接:https://leetcode.cn/problems/minimum-depth-of-binary-tree

leetcode AC记录:

思路:层序遍历,如果碰到叶子节点,返回层数。

代码如下:

public int minDepth(TreeNode root) {
        if(root == null) {
            return 0;
        }

        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int res = 1;
        while(!queue.isEmpty()) {
            int size = queue.size();
            int index = 0;
            while(index < size) {
                TreeNode node = queue.pollFirst();
                if(node.left == null && node.right == null) {
                    return res;
                }
                
                 if(node.left != null) {
                    queue.offer(node.left);
                }

                if(node.right != null) {
                    queue.offer(node.right);
                }
                index++;
            }
            res++;
        }
        return res;
    }

 199. 二叉树的右视图

leetcode题目链接:https://leetcode.cn/problems/binary-tree-right-side-view/

leetcode AC记录:

思路:层序遍历,收取每层最后一个节点就是结果。

代码如下:

public List<Integer> rightSideView(TreeNode root) {
        if(root == null) {
            return new ArrayList<>(0);
        }

        List<Integer> res = new ArrayList<>(16);
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int size = queue.size();
            int index = 0;
            while(index < size) {
                TreeNode node = queue.pollFirst();

                if(node.left != null) {
                    queue.offer(node.left);
                }

                if(node.right != null) {
                    queue.offer(node.right);
                }

                if(index + 1 == size) {
                    res.add(node.val);
                }
                index++;
            }
        }

        return res;
    }

637. 二叉树的层平均值

leetcode题目链接:https://leetcode.cn/problems/average-of-levels-in-binary-tree

leetcode AC记录:

思路:层序遍历,每层求平均值。

代码如下:

public List<Double> averageOfLevels(TreeNode root) {
        if(root == null) {
            return new ArrayList<>(0);
        }

        List<Double> res = new ArrayList<>();
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int size = queue.size();
            int index = 0;
            Double sum = 0.0;
            while(index < size) {
                TreeNode node = queue.pollFirst();
                sum += node.val;

                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
                index++;
            }
            res.add(sum / size);
            
        }
        return res;
    }

107. 二叉树的层序遍历 II

leetcode题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal-ii

leetcode AC记录:

思路:层序遍历,使用头插法保存结果。

代码如下:

public List<List<Integer>> levelOrderBottom(TreeNode root) {
        if(root == null) {
            return new ArrayList<>(0);
        }

        List<List<Integer>> res = new ArrayList<>(16);
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        while(!queue.isEmpty()) {
            int size = queue.size();
            int index = 0;
            List<Integer> list = new ArrayList<>(size);
            while(index < size) {
                TreeNode node = queue.pollFirst();
                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
                list.add(node.val);
                index++;
            }
            res.add(0, list);
        }
        return res;
    }

100. 相同的树

leetcode题目链接:https://leetcode.cn/problems/same-tree

leetcode AC记录:

思路:递归比较左右子树。

代码如下:

public boolean isSameTree(TreeNode p, TreeNode q) {
        return isSameTreeTravel(p, q);
    }

    public boolean isSameTreeTravel(TreeNode p, TreeNode q) {
        if(p == null && q == null) {
            return true;
        } else if(p == null && q != null) {
            return false;
        } else if(p != null && q == null) {
            return false;
        } else if(p.val != q.val) {
            return false;
        }

        return isSameTreeTravel(p.left, q.left) && isSameTreeTravel(p.right, q.right);
    }

 572. 另一棵树的子树

leetcode题目链接:https://leetcode.cn/problems/subtree-of-another-tree

leetcode AC记录:

思路:遍历主树,使用递归比较,和上题类似。

代码如下:

public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            TreeNode node = queue.pollFirst();
            if(isSameTree(node, subRoot)) {
                return true;
            } else {
                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
            }
        }
        return false;
    }

    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null) {
            return true;
        } else if(p == null && q != null) {
            return false;
        } else if(p != null && q == null) {
            return false;
        } else if(p.val != q.val) {
            return false;
        }

        boolean flag1 = isSameTree(p.left, q.left);
        boolean flag2 = isSameTree(p.right, q.right);
        return flag1 && flag2;
    }

 94. 二叉树的中序遍历

leetcode题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal

leetcode AC记录:

思路:

        方法1:递归法,按照左根右的递归顺序。

        方法2:迭代法,使用栈和指针,指针初始化为根节点,如果指针不为空,指针赋值为当前节点的左节点,如果为空,取栈顶元素,指针指向栈顶元素,输出并将其赋值为当前节点的右节点。

代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>(16);

        // traversal(root, res);
        // return res;
        return traversal(root);
    }

    public void traversal(TreeNode node, List<Integer> res) {
        if(node == null) {
            return;
        }

        traversal(node.left, res);
        res.add(node.val);
        traversal(node.right, res);
    }

    /**
     * 迭代法中序遍历
     * 左中右
     */
    public List<Integer> traversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        if(root == null) {
            return new ArrayList<>(0);
        }
        List<Integer> res = new ArrayList<>(16);
        TreeNode cur = root;
        while(cur != null || !stack.empty()) {
            if(cur != null) {
                stack.push(cur);
                cur = cur.left;
            } else {
                TreeNode node = stack.pop();
                res.add(node.val);
                cur = node.right;
            }
        }
        return res;
    }
}

145. 二叉树的后序遍历

leetcode题目链接:https://leetcode.cn/problems/binary-tree-postorder-traversal

leetcode AC记录:

思路:

        方法1:递归,按照左右根的顺序进行递归。

        方法2:迭代,按照根左右的顺序入栈节点,取的顺序为根右左,然后对结果数组进行反转。

代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>(16);
        // traversal(root, res);
        // return res;
        return traversal1(root);
    }

    //递归法
    public void traversal(TreeNode node, List<Integer> res) {
        if(node == null) {
            return;
        }

        traversal(node.left, res);
        traversal(node.right, res);

       
        res.add(node.val);
    }

    //迭代法
    public List<Integer> traversal1(TreeNode root) {
        if(root == null) {
            return new ArrayList<>(0);
        }

        List<Integer> res = new ArrayList<>(16);
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.empty()) {
            TreeNode node = stack.pop();
            
            res.add(node.val);
            
            //左右中,中右左后反转
            if(node.left != null) {
                stack.push(node.left);
            }
            if(node.right != null) {
                stack.push(node.right);
            }
        }
        Collections.reverse(res);
        return res;

    }
}

 144. 二叉树的前序遍历

leetcode题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal

leetcode AC记录:

思路:

        方法1: 递归法,按照根左右的顺序递归。

        方法2: 迭代法,按照根右左的顺序入栈, 按照根左右的顺序出栈处理。

代码如下:

public List<Integer> preorderTraversal(TreeNode root) {
        TreeNode node = root;
        List<Integer> res = new ArrayList<>(16);
        //递归法
        // traversal1(node, res);
        // return res;
         return traversal1(node);
    }

    /**
     * 递归法
     */
    public void traversal(TreeNode node, List<Integer> res) {
        if(node == null) {
            return;
        }

        res.add(node.val);
        traversal(node.left, res);
        traversal(node.right, res);
    }

    /**
     * 迭代法,使用栈解决
     */
     public List<Integer> traversal1(TreeNode root) {
        if(root == null) {
            return new ArrayList<>(0);
         }

        List<Integer> res = new ArrayList<>(16);
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.empty()) {
            TreeNode node = stack.pop();
            res.add(node.val);
            if(node.right != null) {
                stack.push(node.right);
            }

            if(node.left != null) {
                stack.push(node.left);
            }
        }

        return res;
     }

101. 对称二叉树

leetcode题目链接:https://leetcode.cn/problems/symmetric-tree

leetcode AC记录:

思路:递归遍历左右子树,进行判断。

代码如下:

public boolean isSymmetric(TreeNode root) {
        if(root == null) {
            return true;
        }
        return isSymmetric(root.left, root.right);
    }

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

        boolean flag1 = isSymmetric(left.right, right.left);
        boolean flag2 = isSymmetric(left.left, right.right);
        return flag1 && flag2;
    }

222. 完全二叉树的节点个数

leetcode题目链接:https://leetcode.cn/problems/count-complete-tree-nodes

leetcode AC记录:

代码如下:

 public int countNodes(TreeNode root) {
        if(root == null) {
            return 0;
        }

        return countNodes(root.left) + countNodes(root.right) + 1;
    }

 226. 翻转二叉树

leetcode题目链接:https://leetcode.cn/problems/invert-binary-tree/

leetcode AC记录:

代码如下:

public TreeNode invertTree(TreeNode root) {
        invert(root);
        return root;
    }

    public void invert(TreeNode root) {
        if(root == null) {
            return;
        }

        TreeNode left = root.left;
        root.left = root.right;
        root.right = left;

        invert(root.left);
        invert(root.right);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值