二叉树操作实现
平衡二叉树用途

平衡二叉树用途
平衡二叉树是一种常用的数据结构,在计算机科学中有广泛的应用。
以下是平衡二叉树的几个主要用途:
1. 查找和排序:
平衡二叉树可以用于快速查找和排序数据。
由于平衡二叉树的特殊结构,它可以在O(log n)的时间内完成查找和排序操作。
这使得它成为一种比线性搜索更有效的方法。
2. 实现字典:
平衡二叉树可以用来实现字典,其中键是树中的节点,值是与该键相关联的数据。
在这种情况下,平衡二叉树的节点将按照键的顺序排列,因此查找特定键的值是非常快速的。
3. 数据库:
平衡二叉树可以用于实现数据库中的索引。
索引可以帮助加速数据库的查询操作。
平衡二叉树可以在不需要扫描整个数据库的情况下快速定位特定的记录。
4. 线性数据结构的实现:
平衡二叉树可以用于实现一些常见的线性数据结构,如栈、队列和优先队列。
这是通过在树的一侧添加新节点并在另一侧移除节点来实现的,从而保持平衡性。
5. 模拟:
平衡二叉树可以用于模拟一些实际情况下的问题。
例如,可以使用平衡二叉树来模拟航班预定系统中的座位分配。
总之,平衡二叉树是一种非常有用的数据结构,它可以在许多应用中提供高效的解决方案。
二叉排序树

②若*p结点只有左子树,或只有右子树,则可将*p的左子 树或右子树直接改为其双亲结点*f的左子树,即: f->1child=p->1child(或f->1child=p->rchild); free(p); *f
F *p P P1
*f
F
*f
F *p P
*f
F
Pr
P1
Pr
③若*p既有左子树,又有右子树。则:
-1 0
47
-1
47
47
0
31 69
69
25
0
47
0
25
0
47
-1 0
31
0
69
0
40
69
40
69
0
25 76
40
76
(a)
AL、BL、BR 都是空树
(b) AL、BL、BR 都是非空树
LR型调整操作示意图
2
A
-1
0
C
AR C BL CL CR AR
0 0
B BL CL S
B
A
CR
(a) 插入结点*s后失去平衡
31
0 0 -1
31
0 1
28
0
25
0 0
47
0
25
-1
47
0
25
0
31
0
16 0
28
16
28
0
16 30
30
47
(c) LR(R)型调整
RL型调整操作示意图
A B C A BR CR B BR
AL
C
AL
CL CR
详解平衡二叉树

一、平衡二叉树的概念平衡二叉树(Balanced binary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出的,所以又称为AVL树。
定义:平衡二叉树或为空树,或为如下性质的二叉排序树:(1)左右子树深度之差的绝对值不超过1;(2)左右子树仍然为平衡二叉树.平衡因子BF=左子树深度-右子树深度.平衡二叉树每个结点的平衡因子只能是1,0,-1。
若其绝对值超过1,则该二叉排序树就是不平衡的。
如图所示为平衡树和非平衡树示意图:二、平衡二叉树算法思想若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。
首先要找出插入新结点后失去平衡的最小子树根结点的指针。
然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。
当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。
失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于1的结点作为根的子树。
假设用A表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。
1)LL型平衡旋转法由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。
故需进行一次顺时针旋转操作。
即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。
而原来B的右子树则变成A的左子树。
(2)RR型平衡旋转法由于在A的右孩子C 的右子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。
故需进行一次逆时针旋转操作。
即将A的右孩子C向左上旋转代替A作为根结点,A向左下旋转成为C的左子树的根结点。
而原来C的左子树则变成A的右子树。
(3)LR型平衡旋转法由于在A的左孩子B的右子数上插入结点F,使A的平衡因子由1增至2而失去平衡。
故需进行两次旋转操作(先逆时针,后顺时针)。
即先将A结点的左孩子B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。
动态规划-最优二叉搜索树

动态规划-最优⼆叉搜索树摘要: 本章介绍了⼆叉查找树的概念及操作。
主要内容包括⼆叉查找树的性质,如何在⼆叉查找树中查找最⼤值、最⼩值和给定的值,如何找出某⼀个元素的前驱和后继,如何在⼆叉查找树中进⾏插⼊和删除操作。
在⼆叉查找树上执⾏这些基本操作的时间与树的⾼度成正⽐,⼀棵随机构造的⼆叉查找树的期望⾼度为O(lgn),从⽽基本动态集合的操作平均时间为θ(lgn)。
1、⼆叉查找树 ⼆叉查找树是按照⼆叉树结构来组织的,因此可以⽤⼆叉链表结构表⽰。
⼆叉查找树中的关键字的存储⽅式满⾜的特征是:设x为⼆叉查找树中的⼀个结点。
如果y是x的左⼦树中的⼀个结点,则key[y]≤key[x]。
如果y是x的右⼦树中的⼀个结点,则key[x]≤key[y]。
根据⼆叉查找树的特征可知,采⽤中根遍历⼀棵⼆叉查找树,可以得到树中关键字有⼩到⼤的序列。
介绍了⼆叉树概念及其遍历。
⼀棵⼆叉树查找及其中根遍历结果如下图所⽰:书中给出了⼀个定理:如果x是⼀棵包含n个结点的⼦树的根,则其中根遍历运⾏时间为θ(n)。
问题:⼆叉查找树性质与最⼩堆之间有什么区别?能否利⽤最⼩堆的性质在O(n)时间内,按序输出含有n个结点的树中的所有关键字?2、查询⼆叉查找树 ⼆叉查找树中最常见的操作是查找树中的某个关键字,除了基本的查询,还⽀持最⼤值、最⼩值、前驱和后继查询操作,书中就每种查询进⾏了详细的讲解。
(1)查找SEARCH 在⼆叉查找树中查找⼀个给定的关键字k的过程与⼆分查找很类似,根据⼆叉查找树在的关键字存放的特征,很容易得出查找过程:⾸先是关键字k与树根的关键字进⾏⽐较,如果k⼤⽐根的关键字⼤,则在根的右⼦树中查找,否则在根的左⼦树中查找,重复此过程,直到找到与遇到空结点为⽌。
例如下图所⽰的查找关键字13的过程:(查找过程每次在左右⼦树中做出选择,减少⼀半的⼯作量)书中给出了查找过程的递归和⾮递归形式的伪代码:1 TREE_SEARCH(x,k)2 if x=NULL or k=key[x]3 then return x4 if(k<key[x])5 then return TREE_SEARCH(left[x],k)6 else7 then return TREE_SEARCH(right[x],k)1 ITERATIVE_TREE_SEARCH(x,k)2 while x!=NULL and k!=key[x]3 do if k<key[x]4 then x=left[x]5 else6 then x=right[x]7 return x(2)查找最⼤关键字和最⼩关键字 根据⼆叉查找树的特征,很容易查找出最⼤和最⼩关键字。
树-二叉树

信息学奥赛培训之『树——二叉树』树——二叉树为何要重点研究二叉树? 引 : 为何要重点研究二叉树 ? (1)二叉树的结构最简单,规律性最强; (2)可以证明,所有树都能转为唯一对应的二叉树,不失一般性。
一、二叉树基础1. 二叉树的定义 二叉树是一类非常重要的树形结构,它可以递归地定义如下: 二叉树 T 是有限个结点的集合,它或者是空集,或者由一个根结点以及分别称为左 子树和右子树的两棵互不相交的二叉树。
因此,二叉树的根可以有空的左子树或空的右子树,或者左、右子树均为空。
二叉树有 5 种基本形态,如图 1 所示。
图1 二叉树的 5 种基本形态在二叉树中,每个结点至多有两个儿子,并且有左、右之分。
因此任一结点的儿子 不外 4 种情况:没有儿子;只有一个左儿子;只有一个右儿子;有一个左儿子并且有一 个右儿子。
注意:二叉树与树和有序树 的区别 二叉树与度数不超过 2 的树不同,与度数不超过 2 的有序树也不同。
在有序树中,11如果将树中结点的各子树看成从左至右是有次序的,则称该树为有序树,否则称为无序树。
-1-信息学奥赛培训之『树——二叉树』虽然一个结点的儿子之间是有左右次序的,但若该结点只有一个儿子时,就无须区分其 左右次序。
而在二叉树中,即使是一个儿子也有左右之分。
例如图 2-1 中(a)和(b)是两棵 不同的二叉树。
虽然它们与图 2-2 中的普通树(作为无序树或有序树)很相似,但它们却 不能等同于这棵普通的树。
若将这 3 棵树均看作是有序树,则它们就是相同的了。
图2-1 两棵不同的二叉树图2-2 一棵普通的树由此可见,尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。
不是 ..2. 二叉树的性质图3 二叉树性质1: 在二叉树的第 i 层上至多有 2 i −1 结点(i>=1)。
性质2: 深度为 k 的二叉树至多有 2 k − 1 个结点(k>=1)。
性质3: 对任何一棵二叉树 T,如果其终端结点数为 n0,度为 2 的结点数为 n2,则 n0=n2+1。
数据结构-二叉排序树

二叉排序树操作一、设计步骤1)分析课程设计题目的要求2)写出详细设计说明3)编写程序代码,调试程序使其能正确运行4)设计完成的软件要便于操作和使用5)设计完成后提交课程设计报告(一)程序功能:1)创建二叉排序树2)输出二叉排序树3)在二叉排序树中插入新结点4)在二叉排序树中删除给定的值5)在二叉排序树中查找所给定的值(二)函数功能:1) struct BiTnode 定义二叉链表结点类型包含结点的信息2) class BT 二叉排序树类,以实现二叉排序树的相关操作3) InitBitree() 构造函数,使根节点指向空4) ~BT () 析构函数,释放结点空间5) void InsertBST(&t,key) 实现二叉排序树的插入功能6) int SearchBST(t,key) 实现二叉排序树的查找功能7) int DelBST(&t,key) 实现二叉排序树的删除功能8) void InorderBiTree (t) 实现二叉排序树的排序(输出功能)9) int main() 主函数,用来完成对二叉排序树类中各个函数的测试二、设计理论分析方法(一)二叉排序树定义首先,我们应该明确所谓二叉排序树是指满足下列条件的二叉树:(1)左子树上的所有结点值均小于根结点值;(2)右子数上的所有结点值均不小于根结点值;(3)左、右子数也满足上述两个条件。
根据对上述的理解和分析,我们就可以先创建出一个二叉链表结点的结构体类型(struct BiTNode)和一个二叉排序树类(class BT),以及类中的构造函数、析构函数和其他实现相关功能的函数。
(二)插入函数(void InsertBST(&t,key))首先定义一个与BiTNode<k> *BT同一类型的结点p,并为其申请空间,使p->data=key,p->lchild和p->rchild=NULL。
平衡二叉树
#define RH -1 //右高
//平衡二叉树的类型
struct AVLNode
{
int data;
int bf; //bf结点的平衡因子,只能够取0,-1,1,为左子树的深度减去右子树的深度
struct AVLNode *lchild,*rchild; //左、右孩子指针
{
AVLNode *rc,*rd;
rc=T->rchild;
switch(rc->bf)
{
case RH:
T->bf=rc->bf=EH;
L_Rotate(T);
break;
case LH:
rd=rc->lchild;
switch(rd->bf)
{
case RH:
T->bf=LH;
rc->bf=EH;
};
2.右旋操作:
void R_Rotate(AVLNode *&p)//LL型算法
{
AVLNode *lc=p->lchild; // lc指向p的左子树根结点
p->lchild=lc->rchild; // lc的右子树挂接为p(之前跟节点)的左子树
lc->rchild=p;
p=lc; // p指向新的根结点
插入和删除:
插入删除是互为镜像的操作。我们可以采用前面对二叉排序树的删除操作来进行。然后,在删除掉结点后,再对平衡树进行平衡化处理。删除之所以删除操作需要的平衡化可能比插入时次数多,就是因为平衡化不会增加子树的高度,但是可能会减少子树的高度,在有有可能使树增高的插入操作中,一次平衡化能抵消掉增高;在有可能使树减低的删除操作中,平衡化可能会带来祖先节点的不平衡。AVL树体现了一种平衡的美感,两种旋转是互为镜像的,插入删除是互为镜像的操作,没理由会有那么大的差别。实际上,平衡化可以统一的这样来操作:
二叉树实验心得(优秀5篇)
二叉树实验心得(优秀5篇)二叉树实验心得篇1二叉树实验心得在进行二叉树实验的过程中,我不仅掌握了一个重要的数据结构——二叉树,还从中体验到了深入理解一个数据结构的魅力和乐趣。
在实验开始时,我首先学习了二叉树的基本概念,如节点、左子树、右子树等。
我明白了二叉树是一种重要的数据结构,它具有层次结构,每个节点最多有两个子节点,且没有祖先节点的左或右子树中的任何一个节点。
接下来,我学习了二叉树的遍历,包括前序遍历、中序遍历和后序遍历。
通过实验,我明白了这些遍历方式的实现原理,并能够灵活地应用它们。
此外,我还学习了递归和迭代两种方法来实现这些遍历方式,这两种方法各有优点和缺点,我深入了解了它们之间的差异。
在进行实验的过程中,我遇到了一些问题,如递归方法导致的栈溢出,以及中序遍历中的栈和队列的使用。
我通过查阅资料和讨论,解决了这些问题,并从中获得了宝贵的经验。
通过这次实验,我更加深入地理解了二叉树的结构和遍历方式,并能够在实际应用中灵活使用。
我明白了数据结构的重要性,以及深入理解数据结构的过程中的乐趣。
同时,我也学会了如何解决问题,并从中获得了宝贵的经验。
总的来说,这次实验是一个非常有意义的经历,我不仅掌握了新的知识,还锻炼了自己的解决问题的能力。
我相信,这次实验将对我未来的学习和工作产生积极的影响。
二叉树实验心得篇2二叉树实验心得这次实验我们了解了二叉树的基本概念,包括二叉树、结点、左子树、右子树、祖先节点等概念。
通过实验,我们对二叉树的性质有了更深刻的理解,比如二叉树只有左子树或右子树,没有左右子树的情况,即空子树。
在实现二叉树时,我们了解了二叉树节点的定义和插入节点的多种方法,包括先插法、后插法等。
我们还学会了利用二叉树来解决实际问题,比如快速查找等问题。
在实验过程中,我们对二叉树的知识进行了深入探究,收获颇丰。
通过这次实验,我对二叉树有了更深刻的认识,明白了二叉树在计算机科学中的重要性。
同时,我对自己的编程能力也有了新的认识,发现自己可以在理解算法的基础上更好地实现它们。
二叉树的遍历及其应用
0引言
所谓遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次 且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。 遍历 在二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。二叉 树作为一种重要的数据结构是工农业应用与开发的重要工具。遍历是二 叉树算法设计中经典且永恒的话题。经典的算法大多采用递归搜索。递 归算法具有简练、清晰等优点,但因其执行过程涉及到大量的堆栈使 用,难于应用到一些严格限制堆栈使用的系统,也无法应用到一些不支 持递归的语言环境[9]。
由先序序列和中序序列来还原二叉树的过程算法思想[7]: (1)若二叉树空,返回空; (2)若不空,取先序序列第一个元素,建立根节点; (3)在中序序列中查找根节点,以此来确定左右子树的先序序列和中 序序列; (4)递归调用自己,建左子树; (5)递归调用自己,建右子树。
4二叉树的遍历的应用
根据二叉树的遍历算法, 可得出如下规律: 规律1: 前序序列遍历第一个为根结点, 后序遍历的最后一个结点为 根结点。 规律2: 前序序列遍历最后一个为根结点右子树的最右叶子结点, 中 序遍历的最后一个结点为根结点右子树的最右叶子结点。 规律3: 中序序列遍历第一个结点为根结点左子树的最左叶子结点,
1遍历二叉树的概念
所谓遍历二叉树,就是遵从某种次序,访问二叉树中的所有结点, 使得每个结点仅被访问一次。这里提到的“访问”是指对结点施行某种 操作,操作可以是输出结点信息,修改结点的数据值等,但要求这种访
问不破坏它原来的数据结构。在本文中,我们规定访问是输出结点信息 data,且以二叉链表作为二叉树的存贮结构。由于二叉树是一种非线性 结构,每个结点可能有一个以上的直接后继,因此,必须规定遍历的规 则,并按此规则遍历二叉树,最后得到二叉树所有结点的一个线性序 列[1]。
数据结构-C语言-树和二叉树
练习
一棵完全二叉树有5000个结点,可以计算出其
叶结点的个数是( 2500)。
二叉树的性质和存储结构
性质4: 具有n个结点的完全二叉树的深度必为[log2n]+1
k-1层 k层
2k−1−1<n≤2k−1 或 2k−1≤n<2k n k−1≤log2n<k,因为k是整数
所以k = log2n + 1
遍历二叉树和线索二叉树
遍历定义
指按某条搜索路线遍访每个结点且不重复(又称周游)。
遍历用途
它是树结构插入、删除、修改、查找和排序运算的前提, 是二叉树一切运算的基础和核心。
遍历规则 D
先左后右
L
R
DLR LDR LRD DRL RDL RLD
遍历规则
A BC DE
先序遍历:A B D E C 中序遍历:D B E A C 后序遍历:D E B C A
练习 具有3个结点的二叉树可能有几种不同形态?普通树呢?
5种/2种
目 录 导 航 Contents
5.1 树和二叉树的定义 5.2 案例引入 5.3 树和二叉树的抽象数据类型定义 5.4 二叉树的性质和存储结构 5.5 遍历二叉树和线索二叉树 5.6 树和森林 5.7 哈夫曼树及其应用 5.8 案例分析与实现
(a + b *(c-d)-e/f)的二叉树
目 录 导 航 Contents
5.1 树和二叉树的定义 5.2 案例引入 5.3 树和二叉树的抽象数据类型定义 5.4 二叉树的性质和存储结构 5.5 遍历二叉树和线索二叉树 5.6 树和森林 5.7 哈夫曼树及其应用 5.8 案例分析与实现
二叉树的抽象数据类型定义
特殊形态的二叉树
只有最后一层叶子不满,且全部集中在左边
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南 京 航 空 航 天 大 学 第1页 (共21页) 《数据结构》上机实验报告
2015年第1学期 第5次上机 上机日期:2015年11月 29 日 班号1614101 学号071440225 姓名 孙维松 一、调试成功程序及说明 1、
题目:二叉树的链式存储结构 算法思想:InitBiTree() 建立一个空的树 CreateBiTree 用先序遍历的顺序,构造一颗二叉树 TraverBiTree 用递归的算法时间二叉树的先序,终须,后序遍历 DeleteBiTree 用递归算法,先删除左子树在删除有字数,最后删除根 Child 先找出结点位置,判断左或者右孩子是否为空,返回对应的值 FindNode 应用队列的方法,先让树进队列,出队列的时候让树德左孩子和右孩子分别进栈,用i统计,进栈次数,i最后的值就是结点所对应的位置 Parent 先找出结点,最后返回父母的指针,如果是根节点就返回NULL InsertChild 先找出插入的位置,之后将所要插入的树插入该结点的左或则右子树上 DeleteChild 调用Delete函数,实现子树的删除算法 源程序:#include
#include
usingnamespace std; //----二叉树的二叉链表存储表示------ #defineNUM 40 #defineEMPTYNULL #defineLEFT 0 #defineRIGHT 1
typedefcharTElemType; //定义数据类型 第2页(共21页) typedefstructBiTNode { TElemType data; structBiTNode *lchild, *rchild; //左右孩子指针 }BiTNode, *QElemType,*BiTree;
typedefstructQNode { QElemType data; QNode *next; }QNode, *QueuePtr;
typedefstruct { QueuePtr front; //队头指针 QueuePtr rear; //队尾指针 }LinkQueue;
void InitQueue(LinkQueue&Q) { //构造一个空队列Q Q.front = Q.rear = newQNode; //分配存储空间 if (!Q.front) //存储空间分配失败 { cout <<"存储空间申请失败!!"<< endl; exit(1); } Q.rear->next = NULL; }//InitQueue
void DestroyQueue(LinkQueue&Q) { //销毁队列 while (Q.front != NULL) { Q.rear = Q.front->next; deleteQ.front; Q.front = Q.rear; } return; }//DestroyQueue
void EnQueue(LinkQueue&Q, QElemTypee) { //插入元素e为Q的心得对位元素 QueuePtr p; //构造一个节点存储数据 p = newQNode; if (p == NULL) { cout <<"申请空间失败"<< endl; //申请空间失败 exit(1); } p->data = e; //赋值 Q.rear->next = p; //将尾节点跟新节点连接 第3页(共21页) Q.rear = Q.rear->next; //队尾向后移动一位 Q.rear->next = NULL; }//EnQueue
void DeQueue(LinkQueue&Q, QElemType&e) { //若队列不空,则删除Q的队头元素,用e返回其值,并返回OK //否则返回ERROR if (Q.front == Q.rear) //拖尾空队列,则返回错误 { cout <<"该队列为空队列!"<< endl; return; } QueuePtr p; p = Q.front->next; //p指向队列队头 e = p->data; //输出删除元素 Q.front->next = p->next; //将队头向后移动 if (p == Q.rear) Q.rear = Q.front; //如果只有一个元素,将队尾指向队头 delete p; //删除节点 } //DeQueue
//若队列为空队列,返回TRUE,否则返回FALSE bool QueueEmpty(LinkQueueQ) { //若队列为空队列,返回TRUE,否则返回FALSE if (Q.front == Q.rear) returntrue; elsereturnfalse; } //QueueEmpty
//-----BiTree基本操作函数------ void InitBiTree(BiTree&T) { T = newBiTNode; } //End of Method InitTree
void DestroyBiTree(BiTree&T) { //销毁树T if (T->lchild != NULL) { DestroyBiTree(T->lchild); }
if (T->rchild != NULL) { DestroyBiTree(T->rchild); }
deleteT; } //End of Method DestroyTree 第4页(共21页) //构造二叉树 void CreateBiTree(BiTree&T) { TElemType ch; ch=cin.get();
T = newBiTNode; if (ch == '#') { T = NULL; return; }
else { T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }
return; } void QuickCreateBiTree(BiTree&T, charch[]) { //按照线序次序输入二叉树中结点的值(一个字符),0表示空树, //构造二叉链表表示的二叉树T; staticint i = 0;
if (*(ch + i) == '#') { T = NULL; i++; } else { T = newBiTNode; if (T == NULL) { cout <<"没有成功构造节点!"<< endl; exit(1); } T->data = *(ch+i); //生成根节点 i++; QuickCreateBiTree(T->lchild, ch); //构造左孩子 QuickCreateBiTree(T->rchild, ch); //构造右孩子 } return; }//End of Method CreateTree
void MyCreatBiTree(BiTree&T) 第5页(共21页) { //数组存储线序遍历的字符,在调用CreateTree函数 cout <<"请按照先序遍历的顺序输入字符,注意#表示空节点(已输入)"<< endl; TElemType ch[NUM]="ABD##E#FG###C##";
QuickCreateBiTree(T, ch); }//End of Method MyCreatTree void ClearBiTree(BiTree&T) { //先销毁T,早构造一个空树 DestroyBiTree(T); InitBiTree(T); }//ClearTree
bool BiTreeEmpty(constBiTreeT) { if (T == NULL) returnfalse; elsereturntrue; }//TreeEmpty
int BiTreeDepth(constBiTreeT) { int i;//左子树的深度 int j; //右子树的深度
if (T == NULL) { return 0; }
if (T->lchild != NULL) { i = BiTreeDepth(T->lchild); }
else { i = 0; }
if (T->rchild != NULL) { j = BiTreeDepth(T->rchild); }
else { j = 0; }