나무의 높이와 너비 구하기 | 나무

2967 단어
  • 나무의 높이 방법 1: 귀속 방법으로..
  • // 
    int getTreeHigh(BiTree Tree)
    {
        int LeftTreeHigh = 0,RightTreeHigh = 0;
    
        if (Tree==NULL)
        {
            return 0;
        }
    
        LeftTreeHigh = getTreeHigh(Tree->lchild)+1;
        RightTreeHigh = getTreeHigh(Tree->rchild)+1;
    
        return getMax(LeftTreeHigh,RightTreeHigh);
    }
    

    최소 가지 길이를 구하는 것을 삽입합니다.
    // 
    int getTreeLeastHigh(BiTree Tree)
    {
        int LeftTreeHigh = 0,RightTreeHigh = 0;
    
        if (Tree==NULL)
        {
            return 0;
        }
    
        
        LeftTreeHigh = getTreeLeastHigh(Tree->lchild)+1;
    
        RightTreeHigh = getTreeLeastHigh(Tree->rchild)+1;
    
        return getMin(LeftTreeHigh,RightTreeHigh);
    }
    

    방법2: 높이를 가지고 돌아다니며 잎 노드 사이의 높이를 비교한다
    // 
    static int MaxDepth = 0;
    void getTreeHigh3(BiTree Tree,int Depth=0)
    {
        if (Tree!=NULL)
        {
            // 
            if ((Tree->lchild==NULL)&&(Tree->rchild==NULL))
            {
                if (MaxDepthlchild,Depth+1);
            getTreeHigh3(Tree->rchild,Depth+1);
        }
    }
    

    방법 3: 층차를 이용하여 두루 다니면 마지막 층은 높이이다
    // 
    int getTreeHigh2(BiTree Tree)
    {
        if(Tree==NULL)
        {
            return 0;
        }
        Queue MyQueue(100);
        BiNode *p=Tree;
        
    
        // 、 、 
        int High = 0,NodesLeft = 1,NodesCnt = 0;
    
        //printf(" 0:");
        do
        {
            //printf("%d ",p->data);
    
            if (p->lchild!=NULL)
            {
                NodesCnt++;
                MyQueue.EnQueue(p->lchild);
            }
    
            if (p->rchild!=NULL)
            {
                NodesCnt++;
                MyQueue.EnQueue(p->rchild);
            }
    
            NodesLeft--;
            if (NodesLeft==0)
            {
                // 
                NodesLeft = NodesCnt;
                NodesCnt = 0;
                High++;
            }
        }
        while(MyQueue.DeQueue(&p));
    
        return High-1;
    }
    
  • 나무의 최대 폭은 여기서 사용하는 것은 귀속 실현 알고리즘이다. 시간 복잡도는 O(nlgn)이고 차원으로 훑어보는 알고리즘은 더욱 빠르고 시간 복잡도는 O(n)이다.1. 각 층의 너비를 계산하여 비교한다.2. 각 층이 계산할 때 앞의 순서와 역류하는 차이가 많지 않다. 단지 있는 차원에 도달하면 멈추고 중간에 계수를 더한다.PS: 계산할 때 너는 먼저 나무 전체의 높이를 계산해야 한다.참고 문서: 두 갈래 트리의 최대 너비(귀속 방식과 비귀속 방식)
  • // , 0, 
    // , , , 。
    template 
    void getTreeLevelWidth(T Tree,int ObjectDepth,int *WidthCnt,int CurDepth=0)
    {
        if (Tree==NULL||CurDepth>ObjectDepth)
        {
            return;
        }
        else if(CurDepthlchild,ObjectDepth,WidthCnt,CurDepth+1);
            getTreeLevelWidth(Tree->rchild,ObjectDepth,WidthCnt,CurDepth+1);
        }
        else
        {
            (*WidthCnt)++;
        }
    }
    
    template 
    int getTreeMaxWidth(T Tree,int TreeHigh)
    {
        int MaxWidth=0,CurWidth=0;
    
        for (int i = 0;i=MaxWidth)
            {
                MaxWidth = CurWidth;
            }
        }
    
        return MaxWidth;
    }
    
    

    좋은 웹페이지 즐겨찾기