【二叉树进阶题目2】(算法题详细简介)

前言

下面是上一篇文章的链接,有需要的朋友们可以点击下方链接跳转呦~

【二叉树进阶题目1】(算法题详细简介)

下面是本文讲解的题目链接,大家可以先自己尝试一下,再看下文题解~

5. 二叉树的层序遍历 ||(力扣107)

6. 二叉树的层序遍历(力扣102)

7. 根据二叉树创建字符串(力扣606)

8. 二叉树的最近公共祖先(力扣236)

5. 二叉树的层序遍历 ||(力扣107)

5.1 题目链接

下面是题目链接:

5. 二叉树的层序遍历 ||(力扣107)

5.2 示例分析

  • 由于返回类型为二位线性表,所以要先创建线性表
  • 实现基本的层序遍历(用队列实现)
  • 层序遍历的输出顺序是按照从下往上的顺序输出的(先储存后输出)

5.3 代码实现

class Solution {
    
    
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
    
    

        // 创建一个二维链表
        List<List<Integer>> list = new ArrayList<>();
        // 普通的层序遍历
        // 创建一个队列
        Deque<TreeNode> deque = new ArrayDeque<>();
        while (root != null || !deque.isEmpty()) {
    
    
            while (deque.isEmpty()) {
    
    
                deque.offer(root);
            }

            int size = deque.size();
            // 创建一个一维链表
            List<Integer> l = new ArrayList<>();
            for (int i = 0; i < size; i++) {
    
    
                // 队列中插入子树
                if (root.left != null)
                    deque.offer(root.left);
                if (root.right != null)
                    deque.offer(root.right);
                // 将目前队列中的数据存储到链表中
                l.add(deque.pop().val);
                root = deque.peek();
            }
            // 因为顺序为自下而上,所以为头插
            list.add(0, l);

        }
        return list;
    }
}

6. 二叉树的层序遍历(力扣102)

6.1 题目链接

这道题和上述题目相似,这道题是自上而下的方式输出,下面是题目链接,大家一起尝试一下吧。

6. 二叉树的层序遍历(力扣102)

6.2 代码实现

class Solution {
    
    
    public List<List<Integer>> levelOrder(TreeNode root) {
    
    
                List<List<Integer>> ret = new LinkedList<>();
        Deque<TreeNode> deque=new ArrayDeque<>();
        while(root!=null||!deque.isEmpty()){
    
    
            if(deque.isEmpty()){
    
    
                deque.push(root);
            }
            int size=deque.size();
            List<Integer> list=new ArrayList<>();
            for (int i = 0; i < size; i++) {
    
    
                TreeNode t=new TreeNode(deque.pop().val);
                list.add(t.val);

                if(root.left!=null) deque.offer(root.left);
                if(root.right!=null) deque.offer(root.right);

                root=deque.peek();
            }
            ret.add(list);
        }
        return ret;
    }
}

7. 根据二叉树创建字符串(力扣606)

7.1 题目链接

点击下面链接开始做题吧!

7. 根据二叉树创建字符串(力扣606)

7.2 示例分析

本题的解决思路为子问题的方法

对比示例1和示例2,我们可以发现

  1. 当左子树不为空,右子树为空时,输出为“2(4)”
  2. 当左子树为空,右子树不为空时,输出“2()(4)”
  3. 当左子树不为空,右子树不为空时,输出“2(4)(4)”
  4. 当左子树为空,右子树为空时,输出“2”

由于本题的输出为字符串,并且有频繁的插入操作,所以我们创建StringBuilder.

7.3 代码实现

class Solution {
    
    
 public String tree2str(TreeNode root) {
    
    
        if(root==null) return "";
        if(root.left==null&&root.right==null){
    
    
            return Integer.toString(root.val);
        }
        if(root.left!=null&&root.right==null){
    
    
            return new StringBuilder().append(root.val).append("(").append(tree2str(root.left)).append(")").toString();
        }
        return new StringBuilder().append(root.val).append("(").append(tree2str(root.left)).append(")(")
                .append(tree2str(root.right)).append(")").toString();

    }
}

8. 二叉树的最近公共祖先(力扣236)

8.1 题目链接

8. 二叉树的最近公共祖先(力扣236)

8.2 示例分析

以示例1的二叉树为例,讨论本题的多种情况:

  • 第一种:在root的左右子树分别找到一个数,最近公共祖先为root
    在这里插入图片描述
  • 第二种:(这里可以有多种思路,我举一种思路的例子)
    左子树找到一个数就直接返回,右子树没有找到数,说明两个数都在左子树,说明左子树找到的第一个数就是最近祖先
    在这里插入图片描述
  • 第三种:其中一个数等于root,root为最近祖先
    在这里插入图片描述

8.3 代码实现

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
    
        if(root==null||root==p||root==q) return root;
        TreeNode left=lowestCommonAncestor(root.left,p,q);
        TreeNode right=lowestCommonAncestor(root.right,p,q);
        //对应上述3种情况
        if(left==null&&right==null) return null;
        if(left==null) return right;
        if(right==null) return left;
        return root;
    }

关于二叉树的相关习题的两篇文章就结束了,希望对你有所帮助,我们下篇文章见!!!

猜你喜欢

转载自blog.csdn.net/2401_82641862/article/details/143273818