二叉树镜像(递归和非递归):
// 求二叉树的镜像:非递归
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;
}