1、判断二叉树是否为完全二叉树:
层序遍历,从上到下,从左到右,遍历二叉树;
当遇到一个节点的左子树为空时,则该节点的右子树为空和后面遍历的节点都为叶子节点,否则不是完全二叉树。
当该节点只有左子树时,且该子树为叶子结点,否则不为完全二叉树。
判断实现:
bool _IsCompleteBinaryTree(BinaryTreeNode<T>* pRoot)
{
if(pRoot == NULL)
return false;
queue<BinaryTreeNode<T>*> q;
q.push(pRoot);
bool IsOnlyLeft = false;
bool ret = true;
while(!q.empty())
{
BinaryTreeNode<T>* pNode = q.front();
q.pop();
if(IsOnlyLeft)//找到了只有左子树的节点
{
if(pNode->_Left != NULL || pNode->_Right != NULL)
{
ret = false;//不是完全二叉树
break;
}
}
else
{
if(pNode->_Left != NULL && pNode->_Right != NULL)
{
q.push(pNode->_Left);
q.push(pNode->_Right);
}
else if(pNode->_Left != NULL && pNode->_Right == NULL)
{
IsOnlyLeft = true; //找到只有左子树的节点
q.push(pNode->_Left);
}
else if(pNode->_Left == NULL && pNode->_Right != NULL)
{
ret = false;
break;
}
else
{
IsOnlyLeft = true;
}
}
}
return ret;
}
2、求二叉树的镜像
递归:
void _Mirror(BinaryTreeNode<T>*& pRoot)
{
if(pRoot == NULL)
return;
BinaryTreeNode<T>* Left = _Mirror(pRoot->_Left);
BinaryTreeNode<T>* Right = _Mirror(pRoot->_Right);
pRoot->_Left = Right;
pRoot->_Right = Left;
}
非递归:循环(栈)
void _Mirror_nor(BinaryTreeNode<T>*& pRoot)
{
if(NULL == pRoot)
return;
stack<BinaryTreeNode<T>*> stackTreeNode;
stackTreeNode.push(pRoot);
while(stackTreeNode.size())
{
BinaryTreeNode<T>* pNode = stackTreeNode.top();
stackTreeNode.pop();
if(NULL != pNode->Left || NULL != pNode->Right)
{
BinaryTreeNode<T>* pTemp = pNode->Left;
pNode->Left = pNode->Right;
pNode->Right = pTemp;
}
if(NULL != pNode->Left)
stackTreeNode.push(pNode->Left);
if(NULL != pNode->Right)
stackTreeNode.push(pNode->Right);
}
}