题目:二叉树的递归遍历及运用
1.中序建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,分别求其高度、总结点数目、单分支结点数目、叶结点数目
本程序中用到的所有抽象数据类型的定义
//二叉树的二叉链表存储结构
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//BiTree是指向BiTNode的指针类型
算法思路
1.都是很简单的递归,下面一个个来说
建立二叉树
PS:这里的中序建立是指的给节点赋值的顺序是中序的,输入二叉树是还是用的先序。那么对于这里的先序,中序,后序来说,只是赋值位置的不同而已。
算法:大概是先读一个字符,如果是’#'的话,返回一个NULL,代表空结点;不然的话就创造一个新的结点,去创建它的左子树,data域赋值为ch,创建它的右子树,然后返回这个结点。
BiTree create(){//中序创建
char ch;BiTree T;
scanf("%c",&ch);
if(ch=='#') return NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
T->lchild=create();
T->data=ch;
T->rchild=create();
return T;
}
return T;
}
递归遍历
同上,先序,中序,后序,就只是visit()的位置不同而已。这里是先序。
算法:如果T不为空,访问T中的元素,先序遍历T的左子树,然后先序遍历T的右子树。
//先序遍历
Status PreOrder(BiTree T){
if(T!=NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
return OK;
}
}
简单说明:
高度
Status TreeDepth(BiTree T){
int a,b;
if(T==NULL)//空结点高度记为0
return 0;
else
a=TreeDepth(T->lchild);//求左右子树的高度
b=TreeDepth(T->rchild);
if(a>b)//返回左右子树中更高的那颗的高度+1
return a+1;
else
return b+1;
}
总结点数
/*总结点数*/
int n=0;//全局变量计数
Status AllNode(BiTree T){
if(T!=NULL){//其实就是遍历一遍,呵呵
AllNode(T->lchild);
n++;
AllNode(T->rchild);
}
}
叶子结点数
/*叶子结点数目*/
Status LeadNumber(BiTree T){
if(T==NULL)
return 0;
else {//当T不为NULL,没有左右子树的就是叶子结点
if((!T->lchild&&!T->rchild))
return 1;
else//从左子树,右子树中找叶子结点
return (LeadNumber(T->lchild)+LeadNumber(T->rchild));
}
}
单分支结点数
/*单分支结点数目*/
Status SingleChildNode(BiTree T){
if(T==NULL)
return 0;
else if((T->lchild&&!T->rchild)||(!T->lchild&&T->rchild))//左右孩子其中只有一个有
return (SingleChildNode(T->lchild)+SingleChildNode(T->rchild)+1);//返回左右子树的单分支结点数+1
else//从左子树,右子树中找单分支结点
return (SingleChildNode(T->lchild)+SingleChildNode(T->rchild));
}
判断两树是否相等
Status Is_SameTree(BiTree A,BiTree B){
if(A==NULL&&B==NULL)//结点的有无判断
return TURE;
else if(A!=NULL&&B==NULL)
return FALSE;
else if(A==NULL&&B==NULL)
return FALSE;
if(A->data==B->data)//data域的判断,返回左子树是否相等与上右子树是否相等
return (Is_SameTree(A->lchild,B->lchild)&Is_SameTree(A->rchild,B->rchild));
else
return FALSE;
}
结束
Q:创建第一个二叉树之后,无法创建第二个二叉树。
A:在主函数两个create()之间加一个getchar()。