C语言数据结构 二叉树递归方法的特殊操作:查找,宽度,深度,逆置等

查找二叉树节点

求二叉树的深度

交换二叉树的左右子树

求二叉树的最大宽度

求度为2的节点的个数:双分枝节点个数

求度为1和2的节点的个数

度为1的节点的个数

统计所有的节点的个数

找出节点中最小的值

所有节点之和

查找值为x的节点的个数

释放所有的节点

以上方法均采用递归完成

一.递归查找二叉树节点

写法一.

Node *find(Node *node,char ch)
{
    if(node==NULL)
        return NULL;
    else if(node->data==ch)
        return node;
    else
    {
        Node *p=find(node->left,ch);
        if(p)
            return p;
        else
            return find(node->right, ch);
    }
}

写法二.

Node *find_node(Node *node,int ch)
{
    if(node)
    {
        if(node->data==ch)
            return node;
        else
        {
            Node *p=find_node(node->left, ch);
            if(p)
                return p;
            else
                return find_node(node->right, ch);
        }
    }
    else
        return NULL;
}

 

二.求二叉树的深度

int depth(Node *node)
{
    if(node==NULL)
        return 0;
    else
    {
        int ld=depth(node->left);
        int rd=depth(node->right);
        return (ld>rd?ld:rd)+1;
    }
}

三.交换二叉树的左右子树

后序交换法

void reverse(Node *node)
{
    if(node)
    {
        reverse(node->left);
        reverse(node->right);
        Node *temp=node->left;
        node->left=node->right;
        node->right=temp;
    }
}

先序交换法

void reverse_tree(Node *node)
{
    if(node==NULL)
        return;
    
    Node *temp=node->left;
    node->left=node->right;
    node->right=temp;
    
    if(node->left)
        reverse_tree(node->left);
    if(node->right)
        reverse_tree(node->right);
}

四.求二叉树的最大宽度

int count[MAXSIZE];
int max=-1;
void width(Node *node,int level)
{
    if(node==NULL)
        return;
    count[level]++;//level表示当前层数,++表示存在节点,则计数器多加一个
    if(max<count[level])//最大节点计数器
        max=count[level];
    width(node->left, level+1);//进入下一层递归,进入下一个递归时,层数+1
    width(node->right, level+1);
}

五.求度为2的节点的个数:双分枝节点个数

int degree(Node *node)
{
    if(node==NULL)
        return 0;
    if(node->left&&node->right)
        return 1+degree(node->left)+degree(node->right);
    return degree(node->left)+degree(node->right);
}

六.求度为1和2的节点的个数

int degree(Node *node)
{
    if(node==NULL)
        return 0;
    if(node->left||node->right)//条件改为||
        return 1+degree(node->left)+degree(node->right);
    return degree(node->left)+degree(node->right);
}

七.度为1的节点的个数

int degree(Node *node)
{
    if(node==NULL)
        return 0;
    if((node->left&&node->right==NULL)||(node->left==NULL&&node->right))//条件改为||
        return 1+degree(node->left)+degree(node->right);
    return degree(node->left)+degree(node->right);
}

 八.统计所有的节点的个数

int count_node(Node *node)
{
   if(node==NULL)
       return 0;
    else
    {
        int num_left=count_node(node->left);
        int num_right=count_node(node->right);
        return num_left+num_right+1;
    }
}

九.找出节点中最小的值

void min_node(Node *node,int *min)
{
    if(node)
    {
        if(*min>node->data)
            *min=node->data;
        min_node(node->left,min);
        min_node(node->right,min);
    }
}
void find_min(Tree *tree)
{
    int min=tree->root->data;
    min_node(tree->root, &min);
    printf("%d\n",min);
}

十.所有节点之和

int sum_all_node(Node *node)
{
   if(node==NULL)
       return 0;
    else
        return node->data+sum_all_node(node->left)+sum_all_node(node->right);
}

十一.查找值为x的节点的个数

int find_criteria(Node *node,int worth)
{
    if(node==NULL)
        return 0;
    else if(node->data==worth)
        return 1+find_criteria(node->left, worth)+find_criteria(node->right, worth);
    else
        return find_criteria(node->left, worth)+find_criteria(node->right, worth);
}

十二.释放所有的节点

void free_all_node(Node *node)
{
    if(node)
    {
        free_all_node(node->left);
        free_all_node(node->right);
        free(node);
    }
}

 

posted @ 2020-10-25 20:31  雾漫大武汉  阅读(673)  评论(0编辑  收藏  举报