[Leedcode][JAVA][第199题][二叉树的右视图][BFS][DFS][前中后序遍历]

【问题描述】199.二叉树的右视图

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

示例:

输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

【解答思路】

1. BFS

层次遍历时保存每层的最右一个节点
时间复杂度:O(N) 空间复杂度:O(N)

public List<Integer> rightSideView(TreeNode root) {
        if(root == null){
            return  new ArrayList<>();
        }
        List<Integer>  ret =  new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty() ){
            每层的size
            int size = queue.size();
            //遍历当层
            for(int  i =0; i<size ;i++){
                TreeNode node = queue.poll();
                //最右边 
                if(size-1 == i ){
                    ret.add(node.val);
                }
                //遍历当层节点,添加下一层节点
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
            }
            
        }
        return ret;
    }
2. DFS

前序遍历改造,先访问右子树
时间复杂度:O(N) 空间复杂度:O(N)

 public List<Integer> rightSideView(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        dfs(root, 0, res);
        return res;
    }

    private void dfs(TreeNode node, int level, List<Integer> res) {
        if (node == null)
              return;
        if (level == res.size()) 
              res.add(node.val);  // 每一层的第一个节点
        
        dfs(node.right, level+1, res);
        dfs(node.left, level+1, res);

    }


【总结】

1.二叉树遍历
  • 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点
  • 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点
  • 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输出当前结点的数据
2. Queue操作
image
3. 切割子问题 分层思考
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容