问题描述:定位二叉树 bt 中结点值为 x 的结点及其所在的层次。
这里只定位了层次,求路径请看下一篇文章:树和二叉树5
核心代码如下:
int Location_x(BiTree t,char x)
{
static int level=0;
if(t)
{
if(t->data==x)
{
printf("\n结点值为x的结点层次为:%d",level+1);
flag1=0;
}
level++;
Location_x(t->lchild,x);
Location_x(t->rchild,x);
level--;
}
if(!level&&flag1)
printf("\n找不到符合要求的结点");
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int BiTreedestroy(BiTree &t)
{
if(t)
{
if(t->lchild)
BiTreedestroy(t->lchild);
if(t->rchild)
BiTreedestroy(t->rchild);
free(t);
t=NULL;
}
return 1;
}
void BiTreecreate(BiTree &t)
{
char ch;
char pch[]="ABD$$EHJ$$KL$$M$N$$$CF$$G$I$$";
static int i=0;
ch=pch[i++];
if(ch=='$')
t=NULL;
else
{
t=(BiTree)malloc(sizeof(BiTNode));
if(!t) exit(-1);
t->data=ch;
BiTreecreate(t->lchild);
BiTreecreate(t->rchild);
}
}
int flag=1;
void pre_order_traveral_brackets1(BiTree t)
{
if(t)
{
printf("%c",t->data);
if(t->lchild||t->rchild)
{
printf("(");flag++;
}
pre_order_traveral_brackets1(t->lchild);
if(t->rchild)
printf(",");
pre_order_traveral_brackets1(t->rchild);
}
}
void pre_order_traveral_brackets(BiTree t)
{
if(t)
{
printf("%c",t->data);
printf("(");
pre_order_traveral_brackets1(t->lchild);
while(--flag)
{
printf(")");
}
printf(",");
pre_order_traveral_brackets1(t->rchild);
while(flag--+1)
{
printf(")");
}
}
}
int max(int a,int b)
{
return a>b?a:b;
}
int flag1=1;
int location_x(BiTree t,char x,int lever)
{
if(t)
{
if(t->data==x)
{
printf("\n结点值为x的结点层次为:%d",lever);
flag1=0;
}
lever++;
location_x(t->lchild,x,lever);
location_x(t->rchild,x,lever);
lever--;
}
if(lever==1&&flag1)//如果这里level用静态变量倒也不用那么麻烦了
printf("\n找不到符合要求的结点");
}
int Location_x(BiTree t,char x)
{
static int level=0;
if(t)
{
if(t->data==x)
{
printf("\n结点值为x的结点层次为:%d",level+1);
flag1=0;
}
level++;
Location_x(t->lchild,x);
Location_x(t->rchild,x);
level--;
}
if(!level&&flag1)
printf("\n找不到符合要求的结点");
}
int main(){
BiTree binarytree;
char x='N';
BiTreecreate(binarytree);
printf("输出二叉树:");
pre_order_traveral_brackets(binarytree);
Location_x(binarytree,'I');
BiTreedestroy(binarytree);
}