求樹的深度

求樹的深度,依然是遞歸遍歷一棵樹,每次進入一個子結點,記錄樹深

算法思路:

1.這裏採用後續遍歷

2.設置一個全局的變量maxDept

3.每次從樹根進入樹的子結點,讓maxDept的值增加1

若是已經進入作結點,進入右結點就不必要加1了

4.遍歷之後,就能得到樹的深度了

代碼實現:

#include<iostream>
struct TreeNode{
        int value;
        TreeNode* lChild;
        TreeNode* rChild;
};


TreeNode* buildTree(int tnv[],int nodeNumber){
        if(nodeNumber==0)
                return NULL;
        TreeNode* nodes[nodeNumber];
        for(int i=0; i<nodeNumber; i++){
                nodes[i] = new TreeNode;
                nodes[i]->value = tnv[i];
                nodes[i]->lChild = NULL;
                nodes[i]->rChild = NULL;
        }

        //connect all the nodes
        int lChildIndex=0,rChildIndex=0;
        for(int i=0; i<nodeNumber; i++){
                //left child connect
                lChildIndex = 2*i + 1;
                if(lChildIndex < nodeNumber)
                        nodes[i]->lChild = nodes[lChildIndex];

                rChildIndex = 2*i + 2;
                if(rChildIndex < nodeNumber)
                        nodes[i]->rChild = nodes[rChildIndex];
        }

        return nodes[0];
}

//postorder a tree and change the maxDept 
void postorder(TreeNode* root,int& maxDept,int dept){
        TreeNode* p=root;
        dept++;
        if(dept > maxDept)
                maxDept = dept;
        if(p->lChild)
                postorder(p->lChild,maxDept,dept);
        if(p->rChild)
                postorder(p->rChild,maxDept,dept);
}

//return tree's dept
int treeDept(TreeNode* root){
        int maxDept=-1,dept=-1;
        if(!root)
                return -1;
        postorder(root,maxDept,dept);
        return maxDept;
}

int main(){
        int treeNodeNumbers=-1; 
        int treeNodeValue1[]={5,3,7,2,4,6};
        treeNodeNumbers = sizeof(treeNodeValue1)/sizeof(int);
        TreeNode* root1 = buildTree(treeNodeValue1,treeNodeNumbers); 
        std::cout<<"tree1's dept is: "<<treeDept(root1)<<std::endl;
        
        int treeNodeValue2[]={5,3,7,2,4,6,9,1};
        treeNodeNumbers = sizeof(treeNodeValue2)/sizeof(int);
        TreeNode* root2 = buildTree(treeNodeValue2,treeNodeNumbers); 
        std::cout<<"tree2's dept is: "<<treeDept(root2)<<std::endl;

        int treeNodeValue3[]={5,3,7};
        treeNodeNumbers = sizeof(treeNodeValue3)/sizeof(int);
        TreeNode* root3 = buildTree(treeNodeValue3,treeNodeNumbers); 
        std::cout<<"tree3's dept is: "<<treeDept(root3)<<std::endl;

        int treeNodeValue4[]={};
        treeNodeNumbers = sizeof(treeNodeValue4)/sizeof(int);
        TreeNode* root4 = buildTree(treeNodeValue4,treeNodeNumbers); 
        std::cout<<"tree4's dept is: "<<treeDept(root4)<<std::endl;


        int treeNodeValue5[]={6};
        treeNodeNumbers = sizeof(treeNodeValue5)/sizeof(int);
        TreeNode* root5 = buildTree(treeNodeValue5,treeNodeNumbers); 
        std::cout<<"tree5's dept is: "<<treeDept(root5)<<std::endl;
        return 0;
}

運行結果:





其對應的樹分別爲:(樹深度從0開始計數)



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章