二叉树常见题目种类繁多,但是万变不离其宗。
二叉树,以及其他变种树的操作,确实在笔试面试中挺常见。这也属于典型的“面试造航母,工作拧螺丝”。不过熟悉掌握二叉树,对工作以及逻辑思维还是很有帮助的。
今天看一下平衡二叉树和完全二叉树的判断。
一、平衡二叉树
平衡二叉树是指,每一个父节点的左右子树高度差的绝对值小于等于1,这样的二叉树叫平衡二叉树。
请出我们的演员树:
如上图,这棵树就是一颗平衡二叉树。应为每个节点的左右子树的高度差的绝对值都小于等于1。
思路已经清晰了,对比每个父节点的左右子树高度,当所有节点都满足高度差在1以内的时候,证明此二叉树为平衡二叉树。
代码:
// 是否是平衡二叉树
int IsBalanceTreeOnce(Node *pTree,int &iHeight)
{
if(!pTree)
{
iHeight = 0;
return 1;
}
int iHeightLeft = 0;
int iHeightRight = 0;
int iBalanceLeft = IsBalanceTreeOnce(pTree->left, iHeightLeft);
int iBalanceRight = IsBalanceTreeOnce(pTree->right, iHeightRight);
iHeight = (iHeightLeft >= iHeightRight ? iHeightLeft : iHeightRight) + 1;
if (0 == iBalanceLeft || 0 == iBalanceRight)
return 0;
int iDiff = iBalanceLeft - iBalanceRight;
if (iDiff > 1 || iDiff < -1)
return 0;
else
return 1;
}
int IsBalanceTree(Node *pTree)
{
int iHeight = 0;
return IsBalanceTreeOnce(pTree, iHeight);
}
二、完全二叉树
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
如下,为完全二叉树
思路:一层一层比较,一但出现NULL之后,之后不能再存在非空节点,这样即可认为是完全二叉树。
因此可以利用层序遍历算法,层序遍历算法可以参考前一篇文章:
代码:
// 是否是完全二叉树
int IsCompleteTree(Node *pTree)
{
if(!pTree)
return 1;
std::list<Node *> node_list;
node_list.push_back(pTree);
bool bFindNull = false;
while(!node_list.empty())
{
Node *pNode = node_list.front();
node_list.pop_front();
if(!pNode)
{
bFindNull = true;
continue;
}
else if(bFindNull)
{
return 0;
}
node_list.push_back(pNode->left);
node_list.push_back(pNode->right);
}
return 1;
}
欢迎关注我的个人公众号【头发头发等等我】
最后,点赞再看支持一下~