我尝试按如下方式执行二叉树的垂直顺序遍历:1)找出每个节点与根节点之间的最小和最大水平距离2)创建一个hashmap,将水平距离映射到相应的节点(Map)
然而,我得到了不想要的输出,我认为在实现中有一些错误,因为算法对我来说似乎是正确的。
以下是完整的代码:
import java.util.*;
class Node{
int data;
Node right;
Node left;
Node(int data){
this.data = data;
}
}
class Min_Max{
int min;
int max;
Min_Max(int min, int max){
this.min=min;
this.max=max;
}
}
class VerticalOrderTraversalUsingHashing{
public static void findMinMax(Node root,Min_Max obj, int hd){
if(root==null)
return;
if(hd > obj.max)
obj.max = hd;
else if(hd < obj.min)
obj.min = hd;
findMinMax(root.left, obj, hd-1);
findMinMax(root.right, obj, hd+1);
}
public static void verticalOrderTraversal(Node root, Map<Integer,Vector<Integer>> map,int hd){
if(root == null)
return;
if(map.get(hd)==null){
Vector<Integer> temp = new Vector<>();
temp.add(root.data);
map.put(hd,temp);
} else {
Vector<Integer> temp = map.get(hd);
temp.add(root.data);
map.put(hd,temp);
}
}
public static void main(String [] args){
Node root = new Node(12);
root.left = new Node(6);
root.right = new Node(19);
root.left.right = new Node(8);
root.left.left = new Node(-23);
root.right.left = new Node(18);
root.right.right = new Node(52);
Min_Max obj = new Min_Max(99999, -99999);
findMinMax(root, obj, 0);
Map<Integer,Vector<Integer>> map = new HashMap<>();
for(int i=obj.min;i<=obj.max;i++){
Vector <Integer> v = new Vector<>();
v.add(99999);//dummy node to initialize the map
map.put(i,v);
}
verticalOrderTraversal(root, map, 0);
Set keys = map.keySet();
Iterator itr=keys.iterator();
System.out.println(map);
}
}
输出:{-1=[99999],0=[99999,12],-2=[99999],1=[99999],2=[99999]}那么我的apProcah出了什么问题呢?
您可以做一个bfs,在左边添加-1
,在右边添加1
。然后,您可以继续在TreeMap中添加结果,然后在结果中添加所有值。
class Solution {
public List<List<Integer>> verticalOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if(root == null) { return result; }
Map<Integer, List<Integer>> map = new TreeMap<>();
helper(root, map);
result.addAll(map.values());
return result;
}
private void helper(TreeNode root, Map<Integer, List<Integer>> map) {
Queue<TreeNode> q1 = new LinkedList<>();
Queue<Integer> q2 = new LinkedList<>();
q1.offer(root);
q2.offer(0);
while(!q1.isEmpty()) {
TreeNode curr = q1.poll();
int order = q2.poll();
List<Integer> list = map.getOrDefault(order, new ArrayList<>());
list.add(curr.val);
map.put(order, list);
if(curr.left != null) {
q1.offer(curr.left);
q2.offer(order - 1);
}
if(curr.right != null) {
q1.offer(curr.right);
q2.offer(order + 1);
}
}
}
}
我正在尝试对二叉树进行垂直顺序遍历,这个问题:https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/ 我的方法是:我对树中的每个节点进行深度优先搜索,其中根为0。左边的任何内容都是当前根-1,右边的任何内容都是当前根1。我还有一个HashMap,其中键是节点的值(具有相同位置匹配的值),值是具有相同位置(键值
我想对二叉树执行级别顺序遍历。因此,对于给定的树,说: 产出将是: 我知道我可以使用某种队列,但在C中递归地实现这一点的算法是什么?感谢您的帮助。
这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问
我正在研究爪哇的树木,在我正在研究的书中偶然发现了一些令人困惑的台词。给出的顺序遍历图如下: 遍历(递归)的代码是: 我感到困惑的是: 我已经突出了我所困住的部分。首先,我认为在第三步中,inOrder(C)[而不是inOrder(B)]返回inOrder(A)。第二,访问节点的顺序应该是B->A->C。 请帮帮我吧!
我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需
我正在学习如何使用Postorder遍历删除二叉树。我知道要删除一个节点,首先我们需要删除它的子节点,然后是节点本身,所以Postorder遍历最适合删除二叉树。我想使用Inorder遍历做同样的事情,一切都很好,但我不明白下面的代码是如何工作的?