二叉树相关的面试题<一>

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;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值