查找给定节点级别的所有节点

时间:2014-10-31 17:19:08

标签: algorithm data-structures binary-tree

这是一个采访问题: 给定一个节点''一棵二叉树,找到它的所有兄弟姐妹和堂兄弟。节点没有nextPointer

Cousins:与给定节点处于同一级别的节点' k'排除' k'

的兄弟姐妹

我知道答案可能是找到k所在的等级(第一遍)然后打印该等级的所有节点(第二遍)(通过使用等级顺序遍历)。但是,这将是一个2遍算法。任何人都可以为它提出一次通过或更有效的算法。

示例:

      15
     /  \ 
    18   19
   / \   / \
  2   3  4  5
 /\  /  /\
1 6  7  8 9

Input: k=6
Output: 1,7,8,9

3 个答案:

答案 0 :(得分:0)

该算法的大纲将是使用修改后的BFS:

  1. 将队列设置为空
  2. 设置布尔值'找到'为假。
  3. 将根入队。
  4. 将空占位符排入队列。
  5. 对于占位符之前队列中的每个元素,将子项排入队列。在排队时,如果数字与输入值匹配,请设置'找到'真实。
  6. 将空占位符从队列的前面移动到后面。
  7. 如果发现是假,则继续执行5.
  8. 如果找到,则打印队列,但不包括值。
  9. 这将一次完成。

答案 1 :(得分:0)

使用BFS按级别顺序打印树,然后使用给定节点检查每个级别。时间复杂度为O(n)。

答案 2 :(得分:0)

    package com.company;

    import java.util.LinkedList;
    import java.util.Queue;

    public class NodeByLevel {

        LinkedList<Integer> levelOrderList[];

        NodeByLevel(int size){

            levelOrderList = new LinkedList[size];
            for (int i = 0; i < size; i++) {

                levelOrderList[i] =  new LinkedList<>();
            }
        }



public void PrintByValue(Node root , int val){

    int valueLevel = 0;
    LinkedList<Node> queue =  new LinkedList<>();
    Node marker =  new Node(00);
    int lev = 1;
    queue.add(root);
    queue.add(marker);

    while (queue.size()!=0){
        Node node = queue.poll();

        if(node == marker){

            if(queue.isEmpty() == true) break;

            queue.add(marker);
            lev=lev+1;

        }else{
            levelOrderList[lev].add(node.Data);

            if(node.Data == val)
                valueLevel = lev;
        }

        if(node.left!=null){
            queue.add(node.left);
        }
        if(node.right!=null){
            queue.add(node.right);
        }


    }

    System.out.println("level order");
    System.out.println(levelOrderList[valueLevel]);

}


        public static void main(String[] args){

            Node root =  new Node(10);

            root.Insert(root , 4);
            root.Insert(root , 11);
            root.Insert(root , 2);
            root.Insert(root , 6);
            root.Insert(root , 1);
            root.Insert(root , 3);
            root.Insert(root , 8);
            root.Insert(root , 11);
            root.Insert(root , 15);



            //Pass size of the tree
            NodeByLevel service =  new NodeByLevel(10);
            //pass root node and value which wants to print level
            service.PrintByValue(root , 2);

        }

    }

//节点类

public class Node {
    Node left = null;
    Node right = null;
    int Data;

    public Node(int value){
        this.Data = value;
        this.left=null;
        this.right = null;
    }
}