二叉树常见题目种类繁多,但是万变不离其宗。
二叉树,以及其他变种树的操作,确实在笔试面试中挺常见。这也属于典型的“面试造航母,工作拧螺丝”。不过熟悉掌握二叉树,对工作以及逻辑思维还是很有帮助的。
今天看一下平衡二叉树和完全二叉树的判断。
一、平衡二叉树
平衡二叉树是指,每一个父节点的左右子树高度差的绝对值小于等于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;elsereturn 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;}
欢迎关注我的个人公众号【头发头发等等我】
最后,点赞再看支持一下~
719

被折叠的 条评论
为什么被折叠?



