首页 > 编程知识 正文

二叉树用途,二叉树的常用性质

时间:2023-05-03 07:44:18 阅读:161020 作者:2713

1 .二叉树的基本性质1 (二叉树的第I层最多2^(I-1 )个节点) i=1);

性质2 )深度为k的二叉树最高具有2^i - 1个节点(k=1);

性质3 )对于任何树的t,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2 1;

性质4 )具有n个节点的完全二叉树的深度为【log2 n】1;

性质5 )如果将具有n个节点的完全二叉树的节点按照层序(从上到下,从左到右)从1开始编号,则某个编号针对I的节点(1=i=n )

(1) i=1时,编号I的节点为二叉树的根,没有双亲; 在i1的情况下,父母节点的号码为【i/2】;

) 2i n的情况下,号码I的节点中没有左边的孩子; 否则,某个左孩子的节点Lchild(I )的号码为2i;

)3) 2i 1 n时,号码I的节点中没有右边的孩子; 否则,某个右边孩子的节点Rchild(I )的号码是2i 1;

2 .二叉树的存储结构(1)序贯存储结构(仅适用于完全二叉树)对于完全二叉树,从根开始按层序存储即可。 根据完全二叉树的特性,完全二叉树上编号为I的节点元素存储在一维数组中下标为i-1的分量中,但普通二叉树需要填充无节点的空白字符。 很明显,这种收纳方式只适用于完全二叉树,在一般的二叉树中收纳空间被极大地浪费。

const MaxSize=100; //暂定二叉树中节点数的最大值为100 typedef struct { t elemtype * data; //存储空间地址int nodenum //二叉树中节点数}SqBiTree //完全二叉树的逐次存储结构

)2)链存储表示

typedefstructbitnode { telemtypedata; struct BiTNode *lchild,*rchild; //左右儿童的指针(bitree,*BiTree;

3、二叉树遍历(1)先遍历voidpreorder(BiTreet,void ) visit (bi tree ) ) if ) t )//T=NULL时,二叉树为空树,不执行任何操作//函数指针*通过*visit访问根节点,使其能够灵活执行相应的操作preorder(t-lchild )//先遍历左子树preorder(t-rchild ); ((先遍历右部分树) )中顺序遍历

voidinorder(BiTreet,void ) visit ) bitree ) ) if ) t ) inorder ) t-lchild ); //访问按中顺序遍历左侧子树visit(t )的节点inorder(t-rchild ); //按中顺序遍历右边的子树}

)3)后续遍历

voidlatorder(BiTreet,void ) visit (bi tree ) ) if ) t ) latorder ) t-lchild ); latorder(t-rchild ); visit(t; }

)4)非递归扫描(仅以中顺序扫描为例) )。

Typedef enum{Travel=1; Visit=0}TaskType; //Travel为1时,表示动作状态为遍历; 如果Visit为0,则操作状态为Typedef struct{ BiTree ptr; //指向二叉树节点的指针TaskType task; //任务性质(}SElemType; //堆栈元素类型定义voidinorder(BiTreeBt,void ) visit (bi tree ) ) initstack ) s; SElemType e; e.ptr=BT; e.task=Travek; //e是堆栈元素if(Bt ) Push(S ) s,e ); //初始任务while (! 逐个处理sackempty(s ) (/任务pop ) s,e ); if(e.task==visit ) visit ) e.ptr; //访问任务else{if(e.ptr ) { p=e.ptr; e.ptr=p-rchild; 推式(s,e ); //不是最紧迫的任务(遍历右边的子树) e.ptr=p; e.task=Visit; 推式(s,e ); //处理访问任务的工作状态和节点指针堆栈e.ptr=p-lchild; e.task=Travel; 推式(s,e ); ()紧迫任务(横穿左侧树)进入堆栈) } }

4、二叉树遍历的应用(1)建立二叉树链表,按遍历二叉树各节点的顺序输入,对于空节点,在叶的节点后有2个#号) ) ) )。

在voidcreatbitree(bitreet )//遍历二叉树的过程中输入节点字符,建立二叉树的链表存储结构,指针t指向所建立树的节点cinch; if(ch=='# ' ) T=NULL; //建造空树的else { T=new BiTree; //访问操作生成根节点T-data=ch; creatbitree(t-lchild ); //递归构造左子树creatbitree(t-rchild )//递归构造右子树}

(2)求二叉树深度的二叉树深度是二叉树中叶节点所在层次的最大值

voidbitreedepth(bitreet,int h,int depth ) /二叉树的深度(/h求t所指节点的所在层次,t指二叉树的根时,h的初始值为1,depth是现在求出的最大层次bitreedepth(t-rchild,h 1,depth ); }

voidbitreedepth(bitreet ) /在后行扫描中求出二叉树的深度(if ) t ) ) HL=bitreedepth(t-lchild ); HR=nitreedepth(t-rchild ); if(hlhr ) return HR 1; return HL 1; } else return 0; () ) ) ) )。

(3)复制二叉树

bitnode * get treenode (telemtypeitem,BiTNode *lptr,BiTNode *rptr )//元素值为item、左指针为lptr、右指针为rptr的节点t=new bid T-lchild=lptr; T-rchild=rptr; 返回t; }bitree*copytree(bitnode*t ) /已知二叉树的根指针为t,本算法是他的副本的根指针if (! t )返回空值; //复制空树if(t-lchild ) newl ptr=copy tree (t-lchild ); //复制左子木else return newl ptr=空; if(t-rchild ) newrptr=copytree ) t-rchild; //复制右子树else return newrptr=NULL; newnode=gettreenode(t-data,newlptr,newrptr ); //生成根节点return newNode; () ) ) ) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。