二叉树的运算

前序遍历:按照先访问根结点再访问左子树,最后访问右子树的次序访问二叉树中所有结点,而且每个结点仅访问一次。其递归算法如下:

void preorder (btree *p)
{
if(p!=NULL)
{
printf("%d",p->data);
preorder(p->left);//访问左子树
preorder(p->right);//访问右子树
}
}

中序遍历:按照先访问左子树,再访问根结点,最后访问右子树的次序访问二叉树中所有结点,而且每个结点仅被访问一次。其递归算法如下:

void inorder(btree *p)
{
if(p!=NULL)
{
inorder(p->left);//访问左子树
printf("%d",p->data);//访问根结点
inorder(p->right);//访问左子树
}
}

后序遍历:按照先访问左子树,再访问右子树,最后访问根结点的次序访问二叉树中所有结点,而且每个结点仅被访问一次。其递归算法如下:

void postorder(btree *p)
{
if(p!=NULL)
{
postorder(p->left);
postorder(p->right);
printf("%d",p->data);
}
}

输出二叉树:首先输出根结点,然后再依次输出它的左子树与右子树,不过在输出左子树之间要打印出左括号,在输出右括号之间要打印出右括号;另外,依次输出的左、右子树要至少有一个不为空,若都为空就不输出。

void print(btree *b)
{
if(b!=NULL)
{
printf("%d",b->data);//输出根结点
if(b->left!=NULL || b->right!=NULL)
{
printf("(");//打印左括号
printf(b->left);//输出左子树
if(b->right!=NULL) printf(",");//右子树不为空,打印“,”间隔
printf(b->right);//输出右子树
printf(")");//打印右括号
}
}
}

求二叉树的深度:如果一棵二叉树为空,则其深度为0,否则其深度等于左子树和右子树的最大深度加1,有如下递归模型:

|depth(b)=0                                             若b=NULL

|depth(b)=max(depth(b->left,b->right))+1 其它

int depth(btree *b)
{
int dep1,dep2;
if(b==NULL) return(0);
else
{
dep1=depth(b->left);//左子树深度
dep2=depth(b->right);//右子树深度
if(dep1>dep2) reture(dep1+1);//若左子树大于右子树深度,则左子树深度加1
else reture(dep2+1);//反之,右子树深度加1
}
}





posted on 2011-10-18 21:31  bhweb  阅读(105)  评论(0)    收藏  举报

导航