从零开始学数据结构和算法(四)哈希表的思想和二叉树入门(1)

孩子表示法

双亲孩子表示法
  • 把每个结点的孩子结点排列起来,以单链表作为存储结构, 则n个结点有n个孩子链表,如果是叶子结点则此单链表为空, 然后n个头指针又组成一个线性表,采用顺序存储结构,存放在一个一维数组中

孩子兄弟表示法
  • 孩子兄弟表示法为每个节点设计三个域: 一个数据域,一个该节点的第一个孩子节点域,一个该节点的下一个节点的兄弟指针域

二叉树

概念

斜树

满二叉树

完全二叉树

定义:

  • 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

  1. 所有的叶结点都出现在第k层或k-l层(层次最大的两层)
  2. 对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。

一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树。

二叉树的存储结构

顺序存储

链式存储

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二叉树的遍历

前序 ( DLR )

  • 规则是若二叉树为空,则空操作返回,否则先访问跟结点,然后前序遍历左子树,再前序遍历右子树

中序 ( LDR )

  • 规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点), 中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树

后续 ( LRD )

  • 规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点

二叉树简单代码实现

public class BinarayTree {

Node root;

public BinarayTree(String data){

root=new Node<>(data,null,null);

}

public void createTree(){

Node nodeB=new Node(“B”,null,null);

Node nodeC=new Node(“C”,null,null);

Node nodeD=new Node(“D”,null,null);

Node nodeE=new Node(“E”,null,null);

Node nodeF=new Node(“F”,null,null);

Node nodeG=new Node(“G”,null,null);

Node nodeH=new Node(“H”,null,null);

Node nodeJ=new Node(“J”,null,null);

Node nodeI=new Node(“I”,null,null);

root.leftChild=nodeB;

root.rightChild=nodeC;

nodeB.leftChild=nodeD;

nodeC.leftChild=nodeE;

nodeC.rightChild=nodeF;

nodeD.leftChild=nodeG;

nodeD.rightChild=nodeH;

nodeE.rightChild=nodeJ;

nodeH.leftChild=nodeI;

}

/**

  • 中序访问树的所有节点
    /
    public void midOrderTraverse(Node root){//逻辑
    if(root==null){
    return;
    }
    midOrderTraverse(root.leftChild);//逻辑
    System.out.println(“mid:”+root.data);//输出
    midOrderTraverse(root.rightChild);//逻辑
    }
    /
    *
  • 前序访问树的所有节点 Arrays.sort();
    /
    public void preOrderTraverse(Node root){
    if(root==null){
    return;
    }
    System.out.println(“pre:”+root.data);
    preOrderTraverse(root.leftChild);
    preOrderTraverse(root.rightChild);
    }
    /
    *
  • 后序访问树的所有节点
    /
    public void postOrderTraverse(Node root){
    if(root==null){
    return;
    }
    postOrderTraverse(root.leftChild);
    postOrderTraverse(root.rightChild);
    System.out.println(“post:”+root.data);
    }
    /
    *
  • 节点
    */
    public class Node{
    T data;
    Node leftChild;
    Node rightChild;

public Node(T data, Node leftChild, Node rightChild) {
this.data = data;
this.leftChild = leftChild;
this.rightChild = rightChild;
}
}
}

作者:DevYK
链接:https://juejin.im/post/5c9456f25188252d971438a9

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了

image

image

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

g-7dPNoc16-1713507676491)]

[外链图片转存中…(img-mU3qXRFF-1713507676492)]

[外链图片转存中…(img-k69QqRV5-1713507676493)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值