数据结构之二叉树与Java实现(非递归遍历详解)

一、二叉树相关知识1.树1.1 树的概念树是由n(n≥0)n(n \geq 0)n(n≥0)个结点构成的集合,每个结点至多有一个前驱结点(根结点没有前驱结点),每个结点有若干个后继结点,结点满足条件:n>1n \gt 1n>1时,除根结点以外的所有结点被分为若干个不相交的集合S1,S2,⋯ ,SkS_1,S_2,\cdots,S_kS1​,S2​,⋯,Sk​,其中每个集合又符合...
摘要由CSDN通过智能技术生成

一、二叉树相关知识

1.树

1.1 树的概念

树是由 n ( n ≥ 0 ) n(n \geq 0) n(n0)个结点构成的集合,每个结点至多有一个前驱结点(根结点没有前驱结点),每个结点有若干个后继结点,结点满足条件:
n > 1 n \gt 1 n>1时,除根结点以外的所有结点被分为若干个不相交的集合 S 1 , S 2 , ⋯   , S k S_1,S_2,\cdots,S_k S1,S2,,Sk,其中每个集合又符合树的条件,这些树被称为该树的子树。显然,这些集合可能可以再分为更小的集合,此时称为做这棵树子树的子树。依次类推,可知树的定义是递归的。

1.2 常用术语

双亲结点:当前结点的前驱结点称为双亲结点,在图示中,表示为与当前结点相接的上一层结点,每个结点只有一个双亲结点。
孩子结点:当前结点的后继结点称为双亲结点,在图示中,表示为与当前结点相接的下一层结点,每个结点只有若干个孩子结点。
兄弟结点:拥有同一个双亲结点的几个结点关系为兄弟结点,在图示中表示为同一层且与同一个上层结点相接的结点。
根结点:第一个结点称为根结点,根结点没有后继结点,在图示中表示为最顶上的那个结点。
叶节点:若某个结点没有孩子结点,那么它被称为叶结点,在图示中表示为每个最底部所有的结点。(不止是最底层)
结点的入度:与双亲结点连接的边称为入度,故一个结点最多只有一个入度。
结点的出度:与孩子结点连接的边称为出度,故一个结点可能有多个出度。
树的度:树中的结点的出度的最大值,或者说结点的孩子结点的上界。
结点的高度:当前结点到叶子节点的最长简单路径上的边的数量。

1.2 树的表示方法

1.2.1 双亲表示法
双亲表示法,有两个域,data域存储数据,parent域存储该结点的双亲结点的下标。
双亲表示法寻找一个结点的双亲结点很方便,但寻找一个结点的孩子结点不方便。
1.2.2 孩子表示法
设置一个数据域,“树的度”那么多个指针域,这些指针域分别指向当前结点的孩子结点。
孩子表示法寻找一个结点的孩子结点很方便,但寻找一个结点的双亲结点不方便。
1.2.3 双亲孩子表示法
在双亲表示法的基础上,每个结点增加一个指向该孩子所有节点单链表的头指针域,链表依次存储该结点的所有孩子结点。
双亲孩子表示法具有双亲表示法和孩子表示法的优点。
1.2.4 孩子兄弟表示法
重点是孩子兄弟表示法,利用指针表示每个结点的孩子结点以及每个结点的兄弟结点。
方法为设置三个域:一个数据域;一个指向第一个孩子结点的指针域,一个指向第一个兄弟结点的指针域。
如下图:
二叉树孩子兄弟表示法

2.二叉树

2.1 二叉树的概念

满足树的性质且度为2的树,且两个子结点是有区分的,分为左子树和右子树(这里不止是有序的,即使二叉树只有一个子树也要区分是左子树还是右子树),这样的树称为二叉树。

2.2 二叉树的性质

2.2.1 若规定根结点的层次为 0 0 0,则第 i i i层二叉树最多有 2 i ( i ≥ 0 ) 2^i(i \geq0) 2i(i0)个结点。
证明:第一层最多只有根结点,成立;设层次为 n n n时结论成立,即第 n n n层有 2 n 2^n 2n个结点;则当第 n + 1 n+1 n+1层时,由二叉树定义,第 n n n层每个结点最多只有两个子结点,也即最多 2 n + 1 2^{n+1} 2n+1个结点。证毕。

2.2.2 若规定根结点的层次为 0 0 0,则高度为k的二叉树最多有 2 i + 1 − 1 ( i ≥ 0 ) 2^{i+1}-1(i \geq0) 2i+11(i0)个结点。
证明:由2.2.1知每层最多为 2 i 2^i 2i个结点,故总数最多有 2 0 + 2 1 + ⋯ + 2 k = 2 k + 1 − 1 2^0+2^1+\cdots+2^k=2^{k+1}-1 20+21++2k=2k+11<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值