zoukankan      html  css  js  c++  java
  • 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
    ",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);
        }
    }
  • 相关阅读:
    App架构经验总结
    通过C语言程序改动控制台的背景和前景颜色
    java实现读取yaml文件,并获取值
    java 实现yaml 数据转json与map
    yaml标记语言的简介
    重新学习之spring第二个程序,配置AOP面向切面编程
    重新学习之spring第一个程序,配置IOC容器
    重新学习Spring之核心IOC容器的底层原理
    hibernate之xml映射文件关系维护,懒加载,级联
    hibernate映射xml文件配置之一对多,多对多
  • 原文地址:https://www.cnblogs.com/oldfish123/p/13875038.html
Copyright © 2011-2022 走看看