题目描述:对任意给出的二叉树,求其最长路径;
如图 ,其第一条最长路径为[1,2,5,6]
我的解题思路是层次遍历+迭代保存每层最左边的节点ans;
由于我利用HashMap记录了Map<当前节点值,节点的父亲值>,
那么只要利用最后一次更新的节点ans去hashmap不断查找父节点即可,然后逆序输出即为答案。
import java.util.*;
class TreeNode{
int val;
TreeNode left,right;
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class findLongestTreeRoute {
public static void main(String[] args) {
TreeNode node6=new TreeNode(6,null,null);
TreeNode node4=new TreeNode(4,null,null);
TreeNode node5=new TreeNode(5,node6,null);
TreeNode node2=new TreeNode(2,node4,node5);
TreeNode node3=new TreeNode(3,null,null);
TreeNode root=new TreeNode(1,node2,node3);
findLongestRoute(root);
}
public static void findLongestRoute(TreeNode root){
if (root.left==null&&root.right==null) System.out.println(root.val);
else {
//使用广度遍历
Queue<TreeNode> queue=new LinkedList<>();
//map<节点,节点的父亲>;
HashMap<Integer,Integer> hashMap=new HashMap<>();
//保存最近更新的一层最左的节点
TreeNode ans=root;
queue.offer(root);
while (!queue.isEmpty()){
int levelNum=queue.size();
ans=queue.poll();
queue.offer(ans);
//核心关键:以层为单位处理
for(int i=0;i<levelNum;i++){
TreeNode node=queue.poll();
if(node.left!=null){
queue.offer(node.left);
hashMap.put(node.left.val,node.val);
}
if(node.right!=null){
queue.offer(node.right);
hashMap.put(node.right.val,node.val);
}
}
}
//从子节点往父节点找
ArrayList<Integer> list=new ArrayList<>();
int next=ans.val;
while (hashMap.get(next)!=null){
list.add(next);
next=hashMap.get(next);
}
list.add(next);
//逆序打印
Collections.reverse(list);
System.out.println(Arrays.toString(list.toArray()));
}
}
}