1.判断B是否为A的子结构
思路:B如果为A的子结构,要么B和A一样,要么B就是A的左子树或右子树的一部分;
对A的当前节点来说,如果和B的节点相同,那么A的左右子树的节点都要和B相同,(&&的关系);对A的当前节点来说,如果和B的节点不相同,那么在判断左右子树上是否有相同的,(||的关系);
图为:
代码为:
bool IsSubStruct(BinaryTree<T>& b)
{
root1=_root;
root2=b._root;
return _IsSubStruct(root1,root2);
}
bool _IsSubStruct(Node* root1,Node* root2)
{
if(root1==NULL)
return false;
if(root2==NULL)
return true;
if(root1->_data ==root2->_data )
return _IsSubStruct(root1->_left ,root2->_left )&&
_IsSubStruct(root1->_right ,root2->_right );
else
return _IsSubStruct(root1->_left ,root2)||
_IsSubStruct(root1->_right ,root2);
return false;
}
2.判断一颗二叉树是否为完全二叉树
什么是完全二叉树:除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点。
例如:
思路:利用队列先进先出的性质,层次遍历这棵树,在队列中遇到NULL就停止遍历这棵树,当队列不为空时,如果这棵树是完全二叉树,那么队列中的值都为NULL,否则就不是完全二叉树;
bool IsCompleteBinaryTree()
{
//层次遍历,把NULL也push进去
queue<Node*> q;
q.push (_root);
Node* front=q.front ();
while(front!=NULL)
{
q.pop ();
q.push (front->_left );
q.push (front->_right );
front=q.front ();
}
q.pop();
while(!q.empty())
{
front=q.front ();
if(front!=NULL)
{
return false;
}
q.pop();
}
return true;
}