这是一个采访问题:
给定一个节点''一棵二叉树,找到它的所有兄弟姐妹和堂兄弟。节点没有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
答案 0 :(得分:0)
该算法的大纲将是使用修改后的BFS:
这将一次完成。
答案 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;
}
}