×

中序 二叉树

二叉树中,“前序”、“中序”、“后序”指的是什么?完全二叉树的叶子节点数公式是什么

admin admin 发表于2022-05-26 07:12:57 浏览129 评论0

抢沙发发表评论

二叉树中,“前序”、“中序”、“后序”指的是什么


对于例题的后序遍历的答案是,gdbehfca.
解答过程:
1)定义解释:树的遍历的三种情况,是根据左子树、右子树、根这3者的不同访问次序来定义的。根左右(根先访问),则为先序遍历;左根右,则为中序遍历;左右根,则为后序遍历。
2)已知先序和中序遍历结果,求树的结构和后序遍历结果:
先序遍历结果给我们带来的信息是,根在哪。
中序遍历结果给我们带来的信息是,左、右子树在哪。
所以树结构的还原过程是,根据先序找到一个根;然后根据这个根和中序遍历结果找到它的相应的左、右子树;依次往下。
对于例题而言:
先序遍历的第一个节点是a,则说明a是整棵树的根。然后在中序遍历结果中,由a断开,找到a的左子树和右子树,即dgb是a的左子树中的节点集合,echf是a的右子树集合。(dgb)a(echf)
然后开始递归求解:还原(dgb)和(echf)
(dgb)的先序遍历结果是:bdg(从题目中的先序遍历中,截取)
(dgb)的中序遍历结果是:dgb(从题目中的中序遍历中,截取)
所以b为根,(dg)为左子树,右子树为空。即(dgb)=
(dg)b
同理:(echf)=(e)c(hf)
第3次递归:(dg)=
d(g);(hf)=
(h)f
最后得到的结果就是:
((d(g))b)a
((e)c((h)f))
(在这种表示中,括号的层数代表在树中的层数)
a
b
c
d
e
f
g
h
根据这个树,后序遍历为先左、右,最后根
先访问(dgb)
(echf)
然后是a
(dgb)这棵树的后序遍历为gdb
(echf)这棵树的后序遍历为ehfc
所以最后结果为gdb
ehfc
a

完全二叉树的叶子节点数公式是什么


完全二叉树的叶子节点数公式为:设叶子节点数为n0, 度为1的节点数为n1,度为2的节点数为n2,总节点为n。

1、当n为奇数时(即度为1的节点为0个),n0= (n+1)/2。

2、当n为偶数(即度为1的节点为1个), n0= n/2。

n1,n2,都可以求。

完全二叉树的特点:

1.叶子结点只可能在层次最大的两层上出现。

2.对任一结点,若其由分支下的子孙的最大层次为l,则其左分支下的子孙的最大层次必为l或l+1。

完全二叉树的性质:

1.具有n个结点的完全二叉树的深度为logn+1。

2.如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i,有:

(1)如果i=1,则结点i是二叉树的根节点,无双亲;如果i》1,则其双亲是结点⌊i/2⌋。

(2)如果2i》n,则结点i无左孩子;否则其左孩子是结点2i。

(3)如果2i+1》n,则结点i无右孩子;否则其右孩子是结点2i+1。


建一个二叉树并按先序、中序、后序方法遍历此二叉树, 正确调试程序,写出实验报告


#include 《stdlib.h》
#include 《stdio.h》
#include 《time.h》
#define OK 1
#define NULL 0
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, * BiTree;
void visit(char e){
printf(“%c“,e);
}
typedef struct Node{
BiTree data;
struct Node *next;
}Node,*QueueNode;
typedef struct {
QueueNode front;
QueueNode rear;
}Queue;
Queue InitQueue(){
Queue Q;
Q.front=Q.rear=(QueueNode)malloc(sizeof(Node));
if(Q.front!=NULL)
Q.front-》next=NULL;
return Q;
}
void EnQueue(Queue &Q,BiTree e){
QueueNode p;
p=(QueueNode)malloc(sizeof(Node));
if(p==NULL) exit(NULL);
p-》data=e;
p-》next=NULL;
Q.rear-》next=p;
Q.rear=p;
}
BiTree DeQueue(Queue &Q,BiTree e){
QueueNode p;
if( Q.front!=Q.rear ) {
p=Q.front-》next;
Q.front-》next=p-》next;
if(Q.rear==p) Q.rear=Q.front;
e=p-》data;
free(p);
}
return e;
}
void DestroyQueue(Queue &Q){
while(Q.front){
Q.rear=Q.front-》next;
free(Q.front);
Q.front=Q.rear;
}
}
BiTree createTree( ){
char a;
BiTree T;
scanf(“%c“,&a);
if(a==’#’) T=NULL;
else{
T=(BiTNode *)malloc(sizeof(BiTNode *));
T-》data=a;
//creatTree(T-》lchild);
//creatTree(T-》rchild);
T-》lchild=createTree( );
T-》rchild=createTree( );
}
return T;

}
void xianxu(BiTree T){
if(T){
visit(T-》data);
xianxu(T-》lchild);
xianxu(T-》rchild);
}//else printf(“空树“);
}
void zhongxu(BiTree T){
if(T){
// xianxu(T-》lchild);
zhongxu(T-》lchild);
visit(T-》data);
//xianxu(T-》rchild);
zhongxu(T-》rchild);
}//else printf(“空树“);
}
void houxu(BiTree T){
if(T){
//xianxu(T-》lchild);
//xianxu(T-》rchild);
houxu(T-》lchild);
houxu(T-》rchild);
visit(T-》data);
}//else printf(“空树“);
}

void cengci(BiTree &T){
Queue Q;
Q=InitQueue();
if(T) EnQueue(Q,T); visit(T-》data);//printf(“%c“,T-》data);
while(Q.front!=NULL){
T=DeQueue(Q,T);
if(T-》lchild){
EnQueue(Q,T-》lchild);
visit(T-》lchild-》data);
}
if(T-》rchild){
EnQueue(Q,T-》rchild);
visit(T-》rchild-》data);
}

} printf(“\n“);
DestroyQueue(Q);
}
void main(){
BiTree T;
T=createTree();
printf(“先序遍历“);
xianxu(T);

printf(“\n中序遍历“);
zhongxu(T);

printf(“\n后序遍历“);
houxu(T);
printf(“\n层次遍历“);
cengci(T);

}
-中序