面试常见算法3(判断一棵树是否为平衡/搜索/完全二叉树)

16人阅读 评论(0) 收藏 举报
分类:

套路:
列出可能性,定出返回值类型,假定左树能给我这样的类型,假定右树也能给我这样的类型,再做判断。由于是递归函数,最后要写返回给上一级的类型是如何生成的。
利用树的遍历过程中返回一个节点三次,遍历左边的过程收集左子树的信息(要什么信息就设计一个结构记录下来),遍历右边的过程收集右子树的信息,最后整合。

1、判断一棵树是否为平衡二叉树(AVL树)

    public static ReturnData process(Node head) {
        if (head == null)
            return new ReturnData(true, 0);
        ReturnData leftData = process(head.left);
        if (!leftData.isBalanced)
            return new ReturnData(false, 0);
        ReturnData rightData = process(head.right);
        if (!rightData.isBalanced)
            return new ReturnData(false, 0);
        if (Math.abs(rightData.height - leftData.height) > 1) {
            return new ReturnData(false, 0);
        }
        return new ReturnData(true, Math.max(leftData.height, rightData.height) + 1);
    }

    public static boolean isBalancedTree(Node head) {
        return process(head).isBalanced;
    }

2、判断一棵树是否为搜索二叉树(BST,Binary Search Tree)
二叉树中序遍历的结果是依次升序的 <=> 该二叉树是一棵搜索二叉树

方法一:复用非递归的中序遍历,把打印该节点的值改成比较该节点的值是否比上一个节点的值大即可

 // 中序遍历(非递归):
 // 用栈实现,当前节点不为空或者栈不为空继续:
 // 当前节点不为空,当前节点压入栈,当前节点往左跑(左边界一压压一溜);
 // 当前节点为空,从栈中拿一个打印,当前节点向右跑
    public static boolean isBST(Node head) {
        if (head == null) return true;
        int pre = Integer.MIN_VALUE;
        Stack<Node> stack = new Stack<>();
        while (head != null || !stack.isEmpty()) {
            if (head != null) {
                stack.push(head);
                head = head.left;
            } else {
                head = stack.pop();
                //System.out.print(head.value + " ");
                if (head.value > pre) {
                    pre = head.value;
                } else {
                    return false;
                }
                head = head.right;
            }
        }
        //System.out.println();
        return true;
    }

方法二:复用查找后继节点的函数

public static boolean isBST(Node head) {
        Node successorNode = findSuccessorNode(head);
        while (head.value < successorNode.value && findSuccessorNode(successorNode) != null) {
            head = successorNode;
            successorNode = findSuccessorNode(head);
        }
        if (findSuccessorNode(successorNode) == null) return true;
        return false;
    }

查找后继节点的函数如下:

// 若有右子树,则为右子树上最左的节点;若没有右子树,则为第一个满足某种要求的父节点,要求是我在该父节点的左子树上
    public static Node findSuccessorNode(Node head) {
        if (head == null) return null;
        if (head.right != null) return findLeftMostNode(head.right);
        else return findFatherWhichIamInHisLeft(head);
    }

    public static Node findLeftMostNode(Node node) {
        while (node.left != null) {
            node = node.left;
        }
        return node;
    }

    public static Node findFatherWhichIamInHisLeft(Node node) {
        Node parent = node.parent;
        while (parent != null) {
            if (parent.left == node) {
                return parent;
            } else {
                node = parent;
                parent = parent.parent;
            }
        }
        return parent;
    }

3、判断一棵树是否为完全二叉树

    // 队列按层遍历
    // 1、有右孩子没有左孩子,一定不是完全二叉树
    // 2、左右孩子不双全:有左没右,或者左右都没有,(开启一个阶段)后面遇到的节点都必须是叶节点,否则不是完全二叉树
    // 若不违反1和2,则这棵树是完全二叉树
    public static boolean isCBT(Node head) {
        if (head == null) return true;
        Queue<Node> queue = new LinkedList<>();
        boolean leafStage = false;
        queue.offer(head);
        while (!queue.isEmpty()) {
            head = queue.poll();
            Node l = head.left;
            Node r = head.right;
            if ((r != null && l == null) || (leafStage && !(l == null && r == null))) {
                return false;
            }
            if (l != null) {
                queue.offer(l);
            }
            if (r != null) {
                queue.offer(r);
            } else {
                leafStage = true;
            }
        }
        return true;
    }
查看评论

数据结构面试题/判断一棵树是否是完全二叉树

二叉树: 1.满二叉树:在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上。 2.完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个结点的结构相同,称...
  • s25691011
  • s25691011
  • 2017-07-29 20:09:52
  • 1034

【数据结构】判断一棵树是否为完全二叉树

【数据结构】判断一棵树是否为完全二叉树
  • LX18792732127
  • LX18792732127
  • 2017-07-29 15:35:17
  • 911

~判断一棵树是否是完全二叉树~

判断一棵树是否是完全二叉树
  • manongdeyipiant
  • manongdeyipiant
  • 2017-05-03 20:56:25
  • 724

【Java实现】判断一棵树是否为BST,一棵树是否为完全二叉树

给定一个二叉树,判断它是不是二叉搜索树。 思路:对于一棵二叉树,最简单的方法就是中序遍历,看是不是一个递增数列,如果是,则是一棵二叉搜索树,如果不是,则不是二叉搜索树。在这里用一个lastVisit去...
  • universe_ant
  • universe_ant
  • 2017-06-15 01:30:39
  • 2220

判断一棵二叉树是否为完全二叉树

代码如下: package treeInfo; import java.util.LinkedList; class Node{ public Node left; public Node r...
  • zcsky027
  • zcsky027
  • 2014-10-28 21:08:19
  • 2384

二叉树--判断一棵树是否是完全二叉树

完全二叉树: 前n-1层都是满的,第n层如有空缺,则是缺在右边,即第n层的最右边的节点,它的左边是满的,右边是空的。如何判断一个树是否为完全二叉树? 思路一:将所有的结点全部押入队列中,空也压入,每...
  • sayhello_world
  • sayhello_world
  • 2017-07-27 19:16:05
  • 491

如何判断一棵二叉树是否是完全二叉树

初次学习二叉树这种数据结构的时候,我们知道,假如一棵二叉树的高度是h,对于一棵完全二叉树,它的前h-1行一定是满的,第h行可以满也可以不满(结点必须集中于最后一行的左边),如果满则是满二叉树,不满的就...
  • peiyao456
  • peiyao456
  • 2016-11-13 21:00:42
  • 4098

二叉搜索树及判断一棵树是否平衡

二叉搜索树的特点: 1. 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。 2. 左子树上所有节点的关键码(key)都小于根节点的关键码(key)。 ...
  • yangrujing
  • yangrujing
  • 2016-07-08 20:34:42
  • 1042

leetcode的判断一个二叉树是否是平衡树

110. Balanced Binary Tree   Given a binary tree, determine if it is height-balanced. ...
  • justperseve
  • justperseve
  • 2016-10-18 22:10:01
  • 758
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 1203
    排名: 4万+