树的基本操作函数实现

如何使用数组建立二叉树模型

void addroot(int bt[],int rootvalue)
{
    bt[0] = rootvalue;
}

如何给节点添加一个左孩子

void addleftchild(int bt[], int j,int value)
{
    bt[2 * j + 1] = value;
}

如何给节点添加一个右孩子

void addrightchild(int bt[], int j,int value)
{
    bt[2 * j + 2] = value;
}

如何从左孩子找到父节点位置

int getfather(int bt[],int loc)
{
    return floor ((double)(loc-1)/2);
}

如何从有孩子找到父节点的位置

int getfather(int bt[],int loc)
{
    return floor ((double)(loc-2)/2);
}

如何得到子节点是否是单独的节点

int isalone ( int bt[], int j)
{
    int alone  = NO;
    if(j % 2 == 0)
        if(bt[j-1] == 0)
            alone = YES;
    if(j % 2 != 0) // 奇数位置
        if(bt[j + 1] == 0) // 表示位置为空
            alone = YES;
    return alone;
}

如何找到兄弟的位置

int getbrother(int bt[], int j)
{
    if(j % 2 == 0)
        if(isalone(bt,j) == NO)
        
            return  j - 1;
    else
        if(isalone(bt,j) == NO)
            return j + 1;
    else
        return -1;
}

如何得到节点在二叉树中的层次

int getlever(int bt[],int size,int no)
{
    int i;
    for(i = 0; i < size ; i++)
    if(bt[i] == no)
     
        break;
    if(i % 2 == 0)
        return getfatherright(bt,i);
    else
        return
        getfatherlift(bt,i);
}

如何得到结点左孩子的值

int getleftchild(int bt[],int value)
{
return getvalue(bt, 2*getlocation(bt,10,value + 1 );
}

如何得到结点右孩子的值

int getright(int bt[], int value)
{
return getvalue(bt,getlocation(bt,10,value ) + 2);
}

如何检测结点是否有左孩子

int isthereleftchild (int bt[],int value)
{
int left = getleftchild(bt,value);
if(left != 0)
return YES;
else 
return 
NO;
}

如何判断结点是否是其父母的左孩子

int isleftchild(node *n,node *p)
{
return p -> lefchild == n;
}
此处是另一个更加聪明的算法
typedef struct node
{
int data;
struct node * leftchild;
struct node * rightchild;
struct node * parent;
}node;
int isleftchild(node *n)
{
return n -> parent -> leftchild == n;//有更好的可读性

如何得到二叉树的度数

int degree(int bt[], int sizee)
{
int i = 0;
for(int i = 0; i < size; i++)
{
if(bt[i+1] == 0&& bt[i + 2] ==0)
brreak;
if(i == 0)
return 0;
else 
return getlever(bt,10,bt[i]);

如何在树中找到某个值的位置

int getlocation(int bt[],int size, int value)
{
int i = 0;
for(i = 1; i< size ;i++)
{
if(bt[i] == value)
break;
return i;
}

如何计算树中结点个数

int countnode(int bt[], int size)
{
int i = 0;
int count = 0;
for(i = 0; i < size; i++)
{
count++;
if(bt[i+1] ==0&& bt[i+2] == 0)
break;
}
return count;
}

如何得到结点孩子数

int countchildren(int bt[],int j)
{
if(bt[2 * j + 1] == 0&& bt[2 * j + 2]== 0)
return 0; 
if((bt[2 * j + 1]  != 0 && bt[2 * j + 2 == 0) ||  (bt[2 * j + 1]  ==   0 && bt[2 * j + 2]  !=  0))
return 1;
if(bt[2 * j + 1] != 0  && bt[2 * j + 2] == 0)
return 2;
}

如何计算树中叶子个数

int countleaves(int bt[], int size)
{
int i = 0;
int leaves = 0;
for( int i = 0 ; i < size; i ++)
{
if(countchildren(bt,i) == 0 && bt[i] != 0)
leaves++;
}
return leaves;
}

猜你喜欢

转载自blog.csdn.net/king9666/article/details/87553936