[代码随想录] 第十三天

226.翻转二叉树[https://leetcode.cn/problems/invert-binary-tree/description/]
递归:递归三部曲:①确定递归函数的参数和返回值 ②确定终止条件 ③确定单层递归的逻辑

/**
 * 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 TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        swap(root);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }

    public void swap(TreeNode p) {
        TreeNode q = p.left;
        p.left = p.right;
        p.right = q;
    }
}

迭代:直接套用迭代前序遍历模板即可,将visit()调整为swap()即可。

/**
 * 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 TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        Stack<TreeNode> sc = new Stack<>();
        sc.push(root);
        TreeNode p;
        while (!sc.isEmpty()) {
            while (!sc.isEmpty()) {
                p = sc.pop();
                swap(p);//此处就是visit(p);
                if (p.right != null) {
                    sc.push(p.right);
                }
                if (p.left != null) {
                    sc.push(p.left);
                }
            }
        }
        return root;
    }

    public void swap(TreeNode p) {
        TreeNode q = p.left;
        p.left = p.right;
        p.right = q;
    }
}
**-----------------------分割线-------------------------**

102.二叉树的层序遍历[https://leetcode.cn/problems/binary-tree-level-order-traversal/]
思路:与迭代前序遍历类似,重点在于int loop = que.size();使用loop记录当前数组大小,使用for一次性弹出多个元素出栈记录,入栈非空孩子节点

/**
 * 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<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        if (root == null) {
            return ans;
        }
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty()) {
            List<Integer> list = new ArrayList<>();
            int loop = que.size();
            for (int i = 0; i < loop; i++) {
                TreeNode temp = que.poll();
                list.add(temp.val);
                if (temp.left != null) {
                    que.offer(temp.left);
                }
                if (temp.right != null) {
                    que.offer(temp.right);
                }
            }
            ans.add(list);
        }
        return ans;
    }
}
**-----------------------分割线-------------------------**

199.二叉树的右视图[https://leetcode.cn/problems/binary-tree-right-side-view/]
思路:层次遍历二叉树的扩展,重点在于使用loop循环遍历元素,退出循环时,p所指向的元素就是每一层最右边的元素,故👉ans.add(p.val);

/**
 * 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> rightSideView(TreeNode root) {
        Queue<TreeNode> que = new LinkedList<>();
        List<Integer> ans = new ArrayList<>();
        TreeNode p = root;
        if (root == null) {
            return ans;
        }
        que.offer(root);
        while (!que.isEmpty()) {
            int loop = que.size();
            for (int i = 0; i < loop; i++) {
                p = que.poll();
                if (p.left != null) {
                    que.offer(p.left);
                }
                if (p.right != null) {
                    que.offer(p.right);
                }
            }
            ans.add(p.val);

        }
        return ans;
    }
}
**-----------------------分割线-------------------------**

429.N叉树的层次遍历[https://leetcode.cn/problems/n-ary-tree-level-order-traversal/submissions/498054658/]
思路:套用层次遍历模板,重点在于loop遍历加入队列时,不是简单的加入左右孩子,而是遍历孩子集合。for(Node n:temp.children){que.offer(n);}此处使用增强for快捷方便。

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> ans = new ArrayList<>();
        if (root == null) {
            return ans;
        }
        Queue<Node> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty()) {
            List<Integer> list = new ArrayList<>();
            int loop = que.size();
            for (int i = 0; i < loop; i++) {
                Node temp = que.poll();
                list.add(temp.val);
                for (Node n : temp.children) {
                    que.offer(n);
                }

            }
            ans.add(list);
        }
        return ans;
    }
}
**-----------------------分割线-------------------------**

515.在每个树中找最大值[https://leetcode.cn/problems/find-largest-value-in-each-tree-row/description/]

/**
 * 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> largestValues(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if (root == null) {
            return ans;
        }
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty()) {
            int loop = que.size();
            int max = que.peek().val;
            for (int i = 0; i < loop; i++) {
                TreeNode temp = que.poll();
                max = temp.val > max ? temp.val : max;
                if (temp.left != null) {
                    que.offer(temp.left);
                }
                if (temp.right != null) {
                    que.offer(temp.right);
                }
            }
            ans.add(max);
        }
        return ans;
    }
}
**-----------------------分割线-------------------------**

116.填充每个节点的下一个右侧结点指针[https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/description/]
思路:同上,loopint loop = que.size();``for (int i = 0; i < loop; i++)循环中temp.next = que.peek();在退出循环时,temp所指向的就是最右边节点,temp.next = null;

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
        if (root == null) {
            return null;
        }
        Node temp = null;
        Queue<Node> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty()) {
            int loop = que.size();
            for (int i = 0; i < loop; i++) {
                temp = que.poll();
                temp.next = que.peek();
                if (temp.left != null) {
                    que.offer(temp.left);
                }
                if (temp.right != null) {
                    que.offer(temp.right);
                }
            }
            temp.next = null;
        }
        return root;
    }
}
**-----------------------分割线-------------------------**

104.二叉树的最大深度[https://leetcode.cn/problems/maximum-depth-of-binary-tree/]

/**
 * 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 int maxDepth(TreeNode root) {
        int x = 0;
        if (root == null) {
            return 0;
        }
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty()) {
            List<Integer> list = new ArrayList<>();
            int loop = que.size();
            for (int i = 0; i < loop; i++) {
                TreeNode temp = que.poll();
                if (temp.left != null) {
                    que.offer(temp.left);
                }
                if (temp.right != null) {
                    que.offer(temp.right);
                }
            }
            x++;
        }
        return x;
    }
}
**-----------------------分割线-------------------------**

111.二叉树的最小深度[https://leetcode.cn/problems/minimum-depth-of-binary-tree/]

/**
 * 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 int minDepth(TreeNode root) {
        int x = 1;
        if (root == null) {
            return 0;
        }
         Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty()) {
            int loop = que.size();
            for (int i = 0; i < loop; i++) {
                TreeNode temp = que.poll();
                if (temp.left != null) {
                    que.offer(temp.left);
                }
                if (temp.right != null) {
                    que.offer(temp.right);
                }
                if(temp.right==null && temp.left==null){
                    return x;
                }
            }
            x++;
        }
        return x;
    }
}
**-----------------------分割线-------------------------**

101.对称二叉树[https://leetcode.cn/problems/symmetric-tree/]
思路:可以编写一个递归判断方法,判定根节点的左子树和右子树是不是对称的,判定是否对称和判定是否相同是一样的逻辑,
判定是否相同时,同时调入左孩子或右孩子。判定是否对称时,一个调入左孩子另一个调入右孩子。

/**
 * 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 boolean isSymmetric(TreeNode root) {
        return isSame(root.left,root.right);
    }
    boolean isSame(TreeNode n1,TreeNode n2){
        if(n1==null&&n2!=null){return false;}
        if(n2==null&&n1!=null){return false;} 
        if (n1== null && n2 == null) {return true; }
        if(n1.val!=n2.val){return false;}
        return isSame(n1.right,n2.left)&&isSame(n1.left,n2.right);
    }
    
}

迭代法:与递归法相同思路,只不过使用了队列代替递归,将队中出队两个元素比较是否相同,注意进队次序要保持相反。

/**
 * 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 boolean isSymmetric(TreeNode root) {
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root.left);
        que.offer(root.right);
        while (!que.isEmpty()) {
            TreeNode left = que.poll();
            TreeNode right = que.poll();
            if (left == null && right == null) {
                continue;
            }
            if (left == null || right == null || left.val != right.val) {
                return false;
            }
            que.offer(left.right);
            que.offer(right.left);
            que.offer(right.right);
            que.offer(left.left);
        }
        return true;
    }
}
今天终于结束了!!
posted @ 2024-01-24 20:54  糟糕的家伙  阅读(10)  评论(0)    收藏  举报