力扣.199二叉树的右视图-java深度优先(DFS)与广度优先(BFS)算法

题目:

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

解法一

思路:

利用树的广度优先遍历BFS,遍历每层的最后一个节点,将其存放到list集合中

代码:

 public static List<Integer> rightSideView(TreeNode root) {
        //定义存放结果的集合
        List<Integer> ret = new ArrayList<>();
        //判断树是否为空
        if (root == null){
            return ret;
        }
        //定义队列存放待查询的节点
        Queue<TreeNode> nodes=new LinkedList<>();
        //树根入队
        nodes.offer(root);
        //层次遍历(BFS广度优先遍历)
        while (!nodes.isEmpty()){
            int size = nodes.size();
            //循环当前层,从左往右出队
            for (int i = 0; i < size; i++) {
                TreeNode node = nodes.poll();
                //判断当前节点左子树
                if (node.left!=null){
                    nodes.offer(node.left);
                }
                //判断当前节点右子树
                if (node.right!=null){
                    nodes.offer(node.right);
                }
                //到达当前层最右节点
                if (i == size-1){
                    ret.add(node.val);
                }
            }
        }
        return ret;
    }

解法二

思路:

采用深度优先遍历dfs,即我们按照 「根结点 -> 右子树 -> 左子树」 的顺序访问, 就可以保证每层都是最先访问最右边的节点的。利用递归就可以遍历整个树结构。

代码:

 //定义list集合
   List<Integer> ret = new ArrayList<>();
 //后序遍历
    public List<Integer> rightSideView1(TreeNode root){
        dfs(root,0);
        return list2;
    }private void dfs(TreeNode root, int i) {
        if (root==null){
            return;
        }
        //先访问当前层的节点,再递归右子树,左子树
        if (i==list2.size()){
            list2.add(root.val);
        }
        i++;
        dfs(root.right,i);
        dfs(root.left,i);
    }

以上两种遍历树的方法,均十分重要,博主建议小伙伴们牢记深度优先dfs和广度优先bfs遍历树的算法

猜你喜欢

转载自blog.csdn.net/qq_43431171/article/details/105691613