您的位置:首页 > 其它

二叉树基础题(三)

2017-04-08 22:15 253 查看
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/69788107冷血之心的博客)

二叉树是在面试中经常被问到的,这里总结下二叉树的常用操作。包括:
判断两棵二叉树是否相同的树:isCompleteBinaryTree(迭代)

判断二叉树是不是平衡二叉树 递归解法:isAVLRec(递归)

10、判断两棵二叉树是否相同的树

/**
判断二叉树是不是完全二叉树(迭代)
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,
第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
有如下算法,按层次(从上到下,从左到右)遍历二叉树,当遇到一个节点的左子树为空时,
则该节点右子树必须为空,且后面遍历的节点左右子树都必须为空,否则不是完全二叉树。
*/
public static Boolean isCompleteBinaryTree(TreeNode root) {
if(root==null)
return false;
// 使用一个队列,将节点依次放入取出
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);

// 设置一个标志位
Boolean flag = false;
while(!queue.isEmpty()){
// 取出一个节点
TreeNode cur = queue.remove();
if(flag){
// 已经出现了有空子树的节点了,后面出现的必须为叶节点(左右子树都为空)
if(cur.left!=null||cur.right!=null){
return false;
}

}else {
if(cur.left!=null&&cur.right!=null){  // 如果左子树和右子树都非空,则继续遍历
queue.add(cur.left);
queue.add(cur.right);
}else if(cur.left!=null&&cur.right==null){  // 如果左子树非空但右子树为空,说明已经出现空节点,之后必须都为空子树
queue.add(cur.left);
flag = true;
}else if(cur.left==null&&cur.right==null){  // 如果左右子树都为空,则后面的必须也都为空子树
flag = true;
}else if(cur.left==null&&cur.right!=null){  // 如果左子树为空但右子树非空,说明这棵树已经不是完全二叉完全树!
return false;
}
}
}
return true;
}


11、判断二叉树是不是平衡二叉树

/**
* 判断二叉树是不是平衡二叉树 递归解法:
* (1)如果二叉树为空,返回真
* (2)如果二叉树不为空,如果左子树和右子树都是AVL树并且左子树和右子树高度相差不大于1,返回真,其他返回假
*/
public static Boolean isAVLRec(TreeNode root){
if(root==null)
return false;
// 如果左子树和右子树高度相差大于1,则非平衡二叉树, getDepthRec()是前面实现过的求树高度的方法
if(Math.abs(getDepth(root.left)-getDepth(root.right))>1){
return false;
}
// 递归判断左子树和右子树是否为平衡二叉树
return isAVLRec(root.left)&&isAVLRec(root.right);
}


如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: