二叉樹映象(遞迴和非遞迴)+ 判斷一棵二叉樹是否是平衡二叉樹+ 判斷一棵樹是否為完全二叉樹
阿新 • • 發佈:2019-02-14
二叉樹映象(遞迴和非遞迴):
// 求二叉樹的映象:非遞迴 void GetBinaryMirror_Nor() { if(_pRoot == NULL) return; stack<Node*> s; s.push(_pRoot); while(!s.empty()) { Node* pCur = NULL; pCur = s.top(); s.pop(); if(pCur->_pLeft || pCur->_pRight) swap(pCur->_pLeft,pCur->_pRight); if(pCur->_pRight) s.push(pCur->_pRight); if(pCur->_pLeft) s.push(pCur->_pLeft); } } // 求二叉樹的映象:遞迴版本 void GetBinaryMirror() { _GetBinaryMirror(_pRoot); } void _GetBinaryMirror(Node* &pRoot) { if(pRoot == NULL) return; if(pRoot->_pLeft == NULL && pRoot->_pRight == NULL) return; swap(pRoot->_pLeft,pRoot->_pRight); _GetBinaryMirror(pRoot->_pLeft); _GetBinaryMirror(pRoot->_pRight); }
判斷一棵二叉樹是否是平衡二叉樹:
bool IsBalanceBinaryTree() { return _IsBalanceBinaryTree(_pRoot); } bool _IsBalanceBinaryTree(Node* pRoot) { if(pRoot == NULL) return true; if(pRoot->_pLeft == NULL && pRoot->_pRight == NULL) return true; size_t L = _Height(pRoot->_pLeft); size_t R = _Height(pRoot->_pRight); int b = R-L; if(b > 1 || b < -1) return false; else return _IsBalanceBinaryTree(pRoot->_pLeft)&&_IsBalanceBinaryTree(pRoot->_pRight); }
判斷一棵樹是否為完全二叉樹:
// 利用層序遍歷來處理--> 關鍵:找第一個度不為2的結點-->後續結點 // 如果有孩子則不是完全二叉樹 // 否則:是 bool IsCompleteBinaryTree() { if(_pRoot == NULL) return false; queue<Node*> q; q.push(_pRoot); bool flag = false; while(!q.empty()) { Node* pCur = NULL; pCur = q.front(); q.pop(); if(!pCur->_pLeft && pCur->_pRight) //只有右孩子 return false; else if(pCur->_pLeft && !pCur->_pRight) //只有左孩子 { if(flag == true) return false; flag = true; } else if(!pCur->_pLeft && !pCur->_pRight) //沒有孩子 { flag = true; } else { if(flag == true) return false; } if(pCur->_pLeft) q.push(pCur->_pLeft); if(pCur->_pRight) q.push(pCur->_pRight); } return true; }