【问题标题】:How to check if all leaves are positioned to the left side of the BinaryTree如何检查所有叶子是否都位于二叉树的左侧
【发布时间】:2015-07-08 22:13:12
【问题描述】:

我一直在为我的讲师发布的考试准备任务而头晕目眩。如果不是因为他“自己”对完美二叉树的定义,这个问题会相对容易解决。

我的任务是这样的:“检查任何给定的 BinaryTree 是否完整(完整 = 除了最后一层之外的所有内容都需要完整AND在最后一层所有叶子都需要在树的左边。写一个指针实现。所以下面的树是他定义中的完整/完美树。

       A

   B       C
D     E  F   

互联网上几乎所有关于完美树或完整树的信息都没有解决“所有叶子都需要在左侧”的具体要求。

到目前为止,我所做的是编写一个类来获取给定树中的节点总数,并将其与基于完美树公式 (Math.pow(2, depth)-1) 的预期数量进行比较)

这是我的代码:

private int numberOfNodes =0;


public void printLevelorder(){
    LinkedBlockingQueue<BinaryNode<E>> stack = new LinkedBlockingQueue<BinaryNode<E>>();
    BinaryNode<E> node = root;
    stack.offer(node);
    while( !stack.isEmpty()){
        node = stack.poll();
        if( node != null){
            if( node.getLeft() != null){
                stack.offer(node.getLeft());
            }if( node.getRight() != null){
                stack.offer(node.getRight());
            }
            numberOfNodes++;
            System.out.print(node.toString()+ " ");
        }

        else{

            return;
        }


    }
    System.out.println();
}
public int getMaxDepth(BinaryNode<E> node){
    int l =0, r =0;
    if( node != null){
        if( node.getLeft() != null){
            l = getMaxDepth(node.getLeft());
        }if( node.getRight() != null){
            r = getMaxDepth(node.getRight());
        }
    }
    return 1 + Math.max(l,r);
}

public boolean isComplete(){
    return isComplete(root);

}

private boolean isComplete(BinaryNode<E> node){

    int depth = this.getMaxDepth(node);
 int expectedNodes = (int)(Math.pow(2,depth)-1);
 System.out.println( numberOfNodes + "  -  " + expectedNodes);


return false;
}

【问题讨论】:

  • 你能用你拥有的代码创建一个小提琴吗? jsfiddle.net 你还需要什么语言? jquery, javascript, php ?
  • 您好,感谢您这么快回复!我需要用Java编写它。 jsfiddle.net允许java代码吗?

标签: binary-tree


【解决方案1】:

我从您的问题中了解到,您只需通过从根开始进行级别顺序遍历来check for a complete binary tree

在遍历过程中,一旦找到一个不是全节点的节点(如果左右子节点都不为空,则该节点是全节点),后面的所有节点都必须是叶子节点.

如果节点的左孩子为空,则右孩子必须为空。

【讨论】:

  • 没错,查看您发送的链接。根据树结果,这正是我所需要的。谢谢!
  • 很高兴能帮上忙。如果您发现答案有用,您可以将其标记为您接受的答案。谢谢
【解决方案2】:

基于@poorvank_bhatia 发送的非常有用的链接,我在java 中的解决方案是这样的:

public void printPostorder(BinaryNode node){
    if( node == null) return;
    printPostorder(node.getLeft());
    printPostorder(node.getRight());
    System.out.print(node.toString()+ " ");
    numberOfNodes++;        
}

public int getNumberOfNodes(){
    return numberOfNodes;           
}

public boolean isComplete(){
    return isComplete(root,0);

}

public boolean isComplete(BinaryNode node, int index){
    if( node == null) return true;

    if( index >= numberOfNodes) return false;

    return (isComplete(node.getLeft(), 2*index +1) 
            && isComplete(node.getRight(),2*index +2));

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2015-04-23
    • 2016-07-26
    相关资源
    最近更新 更多