求二叉樹的深度算法


算法的思想:

  采用二叉樹的后序遍歷非遞歸算法。由於后序遍歷非遞歸算法使用一個棧實現,每次都會在一條路徑上走到最底層才向上訪問,再向右訪問。因此,記錄下棧在遍歷中的最大值,即為二叉樹的最大深度。

#include <iostream>
#include <stack>
using namespace std;
typedef struct BinTree
{
    int data;
    BinTree *lc;
    BinTree *rc;
}BTNode,*BinTree;
int max(int a,int b)
{
    return (a>b)?a:b;
}

int BinTreeDepth(BinTree T)
{
    stack<BinTree> s;
    BinTree p = T,r = NULL;
    int depth=0;
    while(p||!s.empty())
    {
        if(p)
        {    //從根節點向左邊走
            s.push(p);
            int size = s.size();//獲取棧的大小
            depth = max(depth,size);//替換最大值
            p = p->lc;
        }
        else
        {    //左邊走不通向右走
            p = s.top();
            if(p->rc&&p->rc!=r)//如果右子樹存在,且未被訪問過
            {
                p = p->rc;
                s.push(p);
                int size = s.size();//獲取棧的大小
                depth = max(depth,size);//替換最大值
                p = p->lc;
            }else
            {
                p=s.top();
                s.pop();
                cout<<p->data<<endl;
                r=p;            //記錄最近訪問的節點
                p=NULL;            //節點訪問完之后,重置p指針,目的是為了防止再次將左孩子壓棧
            }
        }
    }
    return depth;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM