zoukankan      html  css  js  c++  java
  • 树的孩子兄弟表示法

    typedef struct DataType 
    {
    
    }DataType;
    typedef struct Node 
    {
        DataType element;
        struct Node * pFirstChild;
        struct Node * pNextSibling;
    }*Tree,*Queue;

    树的先序递归遍历:

    void TraverseTree(Tree p)
    {
        if(p==NULL) return;
        cout<<p->element<<endl;
        TraverseTree(p->pFirstChild);
        TraverseTree(p->pNextSibling);
    }

    上面输出结果:访问顺序 A B E C F I G H J K L D

    数的先序非递归遍历:

    void TraverseTree(Tree p)
    {
        if(p==NULL) return;
        cout<<p->element<<endl;
        TraverseTree(p->pNextSibling);
        TraverseTree(p->pFirstChild);
    }

    上面输出结果:A B C D F G H J K L I E

    void AddTree(Tree p,DataType parent,DataType element)
    {
        Queue queue;
        BOOL flag=FALSE;
        Tree tree;
        while (p||!Empty(queue)&&!flag)
        {
            while (p)
            {
                EnQueue(queue,p);
                p=p->pNextSibling;
            }
            if (!Empty(queue))
            {
                p=Dequeue(queue);
                if (p->element==parent)
                {
                    flag=TRUE;
                    tree=p;
                    break;
                }
            }
        }
        Tree temp1=tree->pFirstChild;
        Tree temp2=(Tree)malloc(sizeof(struct Node));
        temp2->element=element;
        temp2->pFirstChild=NULL;
        temp2->pNextSibling=temp1;
        tree->pFirstChild=temp2;
        while (!Empty(queue))
        {
            DeQueue(queue);
        }
    }

    //删除节点:

    (1)找到父节点

    (2)修改父节点及兄弟节点的指向

    (3)析构该节点所对应的树

    析构一棵树:

    (1)层次遍历树的节点,出队的时候free,把访问变成free,同时注意free之前保存其第一个孩子

    //按层次遍历
    void TraverseLayer(Tree p)
    {
        Queue queue;
        while (p||!empty(queue))
        {
            while (p)
            {
                EnQueue(queue,p);
                p=p->pNextSibling;
            }
            if(!empty(queue))
            {
                p=DeQueue(queue);
                cout<<p->element<<endl;
                p=p->pFirstChild;
            }
            else
            {
                return;
            }
        }
    }

    输出结果 A B C D E F G H  I JK L

    Tree FindParent(Tree tree,DataType element)
    {
        Tree p=tree;
        BOOL flag=FALSE;
        Tree parent;
        Queue queue;
        while (p||!Empty(queue)&&!flag)
        {
            while (p)
            {
                EnQueue(queue,p);
                p=p->pNextSibling;
            }
            if (!EmptyQueue(queue))
            {
                p=DeQueue(queue);
                Tree temp=p->pFirstChild;
                while (temp)
                {
                    if (temp->element==element)
                    {
                        parent=p;
                        flag=true;
                        break;
                    }
                }
                p=p->pFirstChild;
            }
        }
        while (!empty(queue))
        {
            Dequeue(queue);
        }
        return parent;
    }
    int  TreeDepth(Tree p)
    {
        if (p==NULL)
        {
            return 0;
        }
        p=p->pFirstChild;
        int max=0;
        while (p)
        {
            int depth=TreeDepth(p);
            if (max<depth)
            {
                max=depth;
            }
            p=p->pNextSibling;
        }
        return max+1;
    }

  • 相关阅读:
    网页编码就是那点事
    .NetCore通过EFCore操作数据库
    我的第一个.netcore程序
    VisoStudio 允许局域网联机调试网站
    MVC 中使用扩展方法
    MVC 简单发送邮件示例
    ASP.NET MVC路由配置
    SQL 存储过程语句拼接愁人的时间类型
    生成并返回 json 结果文件
    Windows Live Writer配置测试
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2668016.html
Copyright © 2011-2022 走看看