有什么方法可以将 depth/level 存储在节点迭代深度优先搜索的 level 和 arraylist 的 hashmap 中?
Is there any way we can store depth/level in a hashmap of level and arraylist of node iterative depth first search?
我知道这是某种编码挑战,我试图解决我使用 BFS 解决的问题,但我也想使用 dfs 解决它。那么有没有一种方法可以在迭代 DFS 中使用节点存储深度,我知道这可以使用递归轻松实现。这是我的进度:
public HashMap<Integer, ArrayList<TreeNode>> getUsingDFS(TreeNode root){
HashMap<Integer, ArrayList<TreeNode>> map = new HashMap();
List<TreeNode> visited = new ArrayList();
Stack<TreeNode> stack = new Stack();
stack.add(root);
int level = 0;
int top = 1;
while(!stack.isEmpty()){
TreeNode tempNode = stack.pop();
//level / depth store here.
map.put(level, map.getOrDefault(level, new ArrayList()).add(tempNode));
visited.add(tempNode);
if(tempNode.left != null){
queue.add(tempNode.left);
}
if(tempNode.right != null){
queue.add(tempNode.right);
}
}
}
我是这样实现的。
public HashMap<Integer, ArrayList<LevelNode>> getUsingDFS(TreeNode root){
HashMap<Integer, ArrayList<LevelNode>> map = new HashMap();
Queue<LevelNode> queue = new LinkedList();
queue.add(new LevelNode(root, 0));
while(!queue.isEmpty()){
LevelNode tempNode = queue.poll();
ArrayList<LevelNode> list = map.getOrDefault(tempNode.level, new ArrayList());
list.add(tempNode);
map.put(tempNode.level, list);
if(tempNode.node.left != null){
queue.add(new LevelNode(tempNode.node.left, tempNode.level+1));
}
if(tempNode.node.right != null){
queue.add(new LevelNode(tempNode.node.right, tempNode.level+1));
}
}
return map;
}
class LevelNode{
TreeNode node;
int level;
LevelNode(TreeNode node, int level){
this.level = level;
this.node = node;
}
}
我知道这是某种编码挑战,我试图解决我使用 BFS 解决的问题,但我也想使用 dfs 解决它。那么有没有一种方法可以在迭代 DFS 中使用节点存储深度,我知道这可以使用递归轻松实现。这是我的进度:
public HashMap<Integer, ArrayList<TreeNode>> getUsingDFS(TreeNode root){
HashMap<Integer, ArrayList<TreeNode>> map = new HashMap();
List<TreeNode> visited = new ArrayList();
Stack<TreeNode> stack = new Stack();
stack.add(root);
int level = 0;
int top = 1;
while(!stack.isEmpty()){
TreeNode tempNode = stack.pop();
//level / depth store here.
map.put(level, map.getOrDefault(level, new ArrayList()).add(tempNode));
visited.add(tempNode);
if(tempNode.left != null){
queue.add(tempNode.left);
}
if(tempNode.right != null){
queue.add(tempNode.right);
}
}
}
我是这样实现的。
public HashMap<Integer, ArrayList<LevelNode>> getUsingDFS(TreeNode root){
HashMap<Integer, ArrayList<LevelNode>> map = new HashMap();
Queue<LevelNode> queue = new LinkedList();
queue.add(new LevelNode(root, 0));
while(!queue.isEmpty()){
LevelNode tempNode = queue.poll();
ArrayList<LevelNode> list = map.getOrDefault(tempNode.level, new ArrayList());
list.add(tempNode);
map.put(tempNode.level, list);
if(tempNode.node.left != null){
queue.add(new LevelNode(tempNode.node.left, tempNode.level+1));
}
if(tempNode.node.right != null){
queue.add(new LevelNode(tempNode.node.right, tempNode.level+1));
}
}
return map;
}
class LevelNode{
TreeNode node;
int level;
LevelNode(TreeNode node, int level){
this.level = level;
this.node = node;
}
}