目录
编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,此为二叉树面试题第二篇,每篇大约5题左右。该系列会不定期更新,敬请期待!
110. 平衡二叉树https://leetcode.cn/problems/balanced-binary-tree/题目描述:
方法一:自顶向下的递归
对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差<= 1,再分别递归遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的过程。
步骤:
利用递归思想进行逐个遍历,时间复杂度较高,为O(N^2)
代码:
- class Solution {
- public int maxDepth(TreeNode root) {
- if (root == null) {
- return 0;
- }
- int leftHeight = maxDepth(root.left);
- int rightHeight = maxDepth(root.right);
-
- return (leftHeight > rightHeight) ?
- (leftHeight + 1) : (rightHeight + 1);
- }
- public boolean isBalanced(TreeNode root) {
- if (root == null) {
- return true;
- }
- int hleft=maxDepth(root.left);
- int hright=maxDepth(root.right);
- return Math.abs(hleft-hright)<=1&&
- isBalanced(root.left)&&isBalanced(root.right);
- }
- }
方法二:自底向上的递归
对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 −1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。
代码:
- class Solution {
- public int maxDepth2(TreeNode root) {
- if (root == null) {
- return 0;
- }
- int leftHeight = maxDepth2(root.left);
- if (leftHeight < 0) {
- return -1;
- }
- int rightHeight = maxDepth2(root.right);
- if(leftHeight>=0&&rightHeight>=0&&
- Math.abs(leftHeight-rightHeight)<=1){
- return Math.max(leftHeight, rightHeight) + 1;
- }else {
- return -1;
- }
- }
- public boolean isBalanced(TreeNode root) {
- return maxDepth2(root)>=0;
- }
- }
对称二叉树https://leetcode.cn/problems/symmetric-tree/题目描述:
方法:递归
(1)如果一个树是空树,这个树是对称的。
(2)如果一个非空树的左子树与右子树完全相同,那么这个树是对称的。
代码:
- class Solution {
- public boolean issymmetric(TreeNode l,TreeNode r) {
- if(l != null&&r == null || l == null && r != null) {
- return false;
- }
- if(l == null && r == null ) {
- return true;
- }
- if(l.val != r.val ) {
- return false;
- }
- return issymmetric(l.left,r.right) && issymmetric(l.right,r.left);
- }
- public boolean isSymmetric(TreeNode root) {
- if(root==null){
- return true;
- }
- return issymmetric(root.left,root.right);
- }
- }
思路:
代码:
- import java.util.Scanner;
-
- class TreeNode1{
- public char val;
- public TreeNode1 left;
- public TreeNode1 right;
-
- public TreeNode1(char val) {
- this.val = val;
- }
- }
-
-
-
- public class Main {
- public static int i = 0;
- public static TreeNode1 createTree(String str){
- TreeNode1 root = null;
-
- if (str.charAt(i) != '#') {
- root = new TreeNode1(str.charAt(i));
- i++;
- root.left = createTree(str);
- root.right = createTree(str);
- } else {
- i++;
- }
- return root;
- }
-
- public static void inOrderTraversal(TreeNode1 root){
- if (root == null) {
- return;
- }
- inOrderTraversal(root.left);
- System.out.print(root.val+" ");
- inOrderTraversal(root.right);
- }
-
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- while (scan.hasNextLine()) {
- String str = scan.nextLine();
- TreeNode1 root = createTree(str);
- inOrderTraversal(root);
- }
-
- }
- }
何为层序遍历?
设二叉树的根节点所在 层数为1 ,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第 2 层 上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
102. 二叉树的层序遍历https://leetcode.cn/problems/binary-tree-level-order-traversal/
题目描述:
解析:
在遍历每一行的节点队列时,将该行每个节点的非空子节点添加到队列中,直到遍历到最后一行时,没有子节点再入队列,结束循环。
代码:
- class Solution {
- public List
> levelOrder(TreeNode root) {
- List
> lists = new ArrayList<>();
- if(root==null){
- return lists;
- }
- Queue
queue=new LinkedList<>(); - queue.offer(root);
- while(!queue.isEmpty()){
- ArrayList
tmp = new ArrayList<>(); - int size=queue.size();
- while (size>0){
- TreeNode cur=queue.poll();
- tmp.add(cur.val);
- size--;
- if(cur.left!=null){
- queue.add(cur.left);
- }
- if(cur.right!=null){
- queue.add(cur.right);
- }
-
- }
- lists.add(tmp);
- }
- return lists;
- }
- }
解析:
定义一个队列,先将根结点入队,如果队列不为空我们就进入循环,将队列的元素进行出栈并赋给cur变量,如果cur不等于null,我们就将cur的左树和右树进行入队,如果cur为null则跳出循环,这时候我可以将队列进行出队,元素全部为null,则为完全二叉树。
代码:
- public boolean isCompleteTree(TreeNode root){
- if(root == null) {
- return true;
- }
- Queue
queue = new LinkedList<>(); - queue.offer(root);
- while (queue.isEmpty()){
- TreeNode cur=queue.poll();
- if(cur!=null){
- queue.offer(cur.left);
- queue.offer(cur.right);
- }else{
- break;
- }
- }
- while (!queue.isEmpty()) {
- TreeNode tmp = queue.poll();
- if(tmp != null) {
- return false;
- }
- }
- return true;
- }
以上为我个人的小分享,如有问题,欢迎讨论!!!
都看到这了,不如关注一下,给个免费的赞