大数据最新【数据结构与算法】初识二叉树(中)_treenode(2),2024年最新美团大数据开发面试

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

7d59a974c36b4bec81a6fb92e8fd2053.jpeg

🍎2.二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为(A)
A: E      B: F      C: G      D: H

🍗🍗解答:先序遍历的第一个节点就是我们的根节点,由题意的A。

🍅3.设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为(D)
A: adbce    B: decab    C: debac    D: abcde

🧀🧀解答:由题意,给出了中序和后续的节点,由后续最后一个节点就是根节点知道a就是根节点,中序第一个节点就是最左侧的节点,那么最左侧的节点就是b,那么看中序的结果是badce,那么根节点a的左孩子就只有一个b,dce都在a的右边,在根据后续遍历的结果dec得出c是右边节点的根节点,于是可以画出我们的二叉树。

6ee4cd5acfb94bcab282ef0d94cca40b.jpeg

🍏 4.某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为(A)
A: FEDCBA   B: CBAFED   C: DEFCBA   D: ABCDEF

🍤🍤解答:我们先来回顾一下后序和中序的遍历方式;后序:左右根   中序:左根右  由题意得知后序与中序的遍历结果相同,那么我们发现舍去右孩子,二者的遍历方式都是左根,也就是说该二叉树是没有右孩子的一颗二叉树。画出效果图如下:

82076a0bd1c64c2dbddc2fc2ac43b3b6.jpeg

🍼🍼重要结论:只给出二叉树的前序和后序的结果,是无法推导出该课二叉树的模型的,也就是三种遍历方式,想要通过其中两种得到第三种的结果,则这两种方式中必须存在中序遍历!

二、二叉树的基本操作

接下来博主将通过idea来演示二叉树的基本操作。

我们下面的基本操作都是基于这个二叉树来完成的!

9d08eb470d9845aa8be8c95bc597f19a.jpeg

1、首先我们新建一个包名为BinaryTree,在这个包下新建两个类Test 和 TestBinaryTree。

9879481b2e184432b43e6ae347609267.png

2、我们初始化实现一个内部类:

      public class TreeNode {
         char val;
         TreeNode left;
         TreeNode right;
         TreeNode() {

         }
         TreeNode(char val) {

             this.val = val;
         }
         TreeNode(char val, TreeNode left, TreeNode right) {
           this.val = val;
           this.left = left;
           this.right = right;
    }
 }

    public TreeNode createTree() {//创建二叉树
        TreeNode A = new TreeNode('A');
        TreeNode B = new TreeNode('B');
        TreeNode C = new TreeNode('C');
        TreeNode D = new TreeNode('D');
        TreeNode E = new TreeNode('E');
        TreeNode F = new TreeNode('F');
        TreeNode G = new TreeNode('G');
        TreeNode H = new TreeNode('H');

        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        C.left = F;
        C.right = G;
        E.right = H;

        return A;
    }

3、三种遍历方式的实现

  public void preOrder(TreeNode root){//前序遍历
         if(root == null){
             return;
         }
         System.out.print(root.val+" ");
         preOrder(root.left);
         preOrder(root.right);
    }

    public void inOrder(TreeNode root){//中序遍历
        if(root == null){
            return;
        }
        preOrder(root.left);
        System.out.print(root.val+" ");
        inOrder(root.right);
    }


    public void postOrder(TreeNode root){//后序遍历
        if(root == null){
            return;
        }
        preOrder(root.left);
        inOrder(root.right);
        System.out.print(root.val+" ");
    }

运行结果:

da208c16bceb4f93a4bf61557a3b525a.png

4、获取树中节点的个数(2种方法)

   // 获取树中节点的个数 两种方法
    public static int nodeSize = 0;
    public int size(TreeNode root) {
        if(root == null) {
            return 0;
        }
        nodeSize++;
        size(root.left);
        size(root.right);
        return nodeSize;
    }

    public int size2(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int tmp = size2(root.left)+size2(root.right)+1;
        return tmp;
    }

运行结果:

0b416e75beaf433f9a0769b2276ee94f.png

5、获取叶子节点的个数(两种方法)

int getLeafNodeCount(TreeNode root) {
        if(root == null) {
            return 0;
        }
        if(root.left == null && root.right == null) {
            return 1;
        }
        int tmp = getLeafNodeCount(root.left) +
                getLeafNodeCount(root.right);
        return tmp;
    }

    public static int leafSize = 0;
    void getLeafNodeCount2(TreeNode root) {
        if(root == null) {
            return ;
        }
        if(root.left == null && root.right == null) {
            leafSize++;
        }
        getLeafNodeCount2(root.left);
        getLeafNodeCount2(root.right);
    }

运行结果:

ea6885fb46014158aeda07d398fa77e5.png

6、判断第K层节点的个数

    int getKLevelNodeCount(TreeNode root,int k) {
        if(root == null || k <= 0) {
            return 0;
        }
        if(k == 1) {
            return 1;
        }
        int tmp = getKLevelNodeCount(root.left,k-1) +
                getKLevelNodeCount(root.right,k-1);
        return tmp;
    }

运行结果:(这里我们求的是第3层的结果)

cb691638394945359feb66e48de7eea3.png

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

外链图片转存中…(img-3VaL9hZf-1715771656787)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值