劍指Offer——判斷平衡二叉樹
阿新 • • 發佈:2019-02-03
題目描述:
輸入一個二叉樹的根節點,
1)求二叉樹的深度。
2)判斷該樹是不是平衡二叉樹。
二叉樹的深度:從根節點遍歷到葉節點的路徑,經過最長路徑的節點數。
平衡二叉樹:二叉樹的任意結點的左右子樹的深度相差不超過1。
struct BinaryTree { int m_nvalue; BinaryTree *m_nleft; BinaryTree *m_nright; }; //二叉樹的深度:從根節點到葉節點的最長路徑 int TreeDepth(BinaryTree *pRoot) { if(pRoot==NULL) return 0; int left=TreeDepth(pRoot->m_nleft); int right=TreeDepth(pRoot->m_nright); return (left>right)?(left+1):(right+1); } //判斷是否為平衡二叉樹,方法一 bool IsBalanced1(BinaryTree *pRoot) { if(pRoot==NULL) return true; int left,right; left=TreeDepth(pRoot->m_nleft); right=TreeDepth(pRoot->m_nright); int dif=left-right; if(dif>1&&dif<-1) return false; return IsBalanced1(pRoot->m_nleft)&&IsBalanced1(pRoot->m_nright); } //判斷是否為平衡二叉樹,方法二 //結點只需遍歷一次,採用後序遍歷。 bool IsBalanced2(BinaryTree *pRoot,int *pdep) { if(pRoot==NULL) { *pdep=0; return true; } int left,right; if(IsBalanced2(pRoot->m_nleft,&left)&&(IsBalanced2(pRoot->m_nright,&right))) { int dif=left-right;//左右子樹的深度差值 if(dif<1||dif>-1) { //記錄該節點的樹深 *pdep=1+(left>right?left:right); return true; } } return false; }