• 树的孩子兄弟表示法


    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;
    }

  • 相关阅读:
    【Learning】积性函数前缀和——洲阁筛(min_25写法)
    GDOI2018记录
    最近公共祖先(一道题目)
    Counting
    【BZOJ4872】【Shoi2017】分手是祝愿
    【BZOJ2654】tree
    数学竞赛
    A
    【bzoj 3131】[Sdoi2013]淘金
    【Never Stop】联赛集训记录
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2668016.html
Copyright © 2020-2023  润新知