二叉树基础题(三)

来源:互联网 发布:ios视频制作软件 编辑:程序博客网 时间:2024/05/16 04:59


(尊重劳动成果,转载请注明出处: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一起交流学习哦~







1 0
原创粉丝点击