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