[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 rightSideView(TreeNode root) {
        if(root == null){
            return  new ArrayList<>();
        }
        List  ret =  new ArrayList<>();
        Queue queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty() ){
            每层的size
            int size = queue.size();
            //遍历当层
            for(int  i =0; i
2. DFS

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

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

    private void dfs(TreeNode node, int level, List 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. 切割子问题 分层思考

你可能感兴趣的:([Leedcode][JAVA][第199题][二叉树的右视图][BFS][DFS][前中后序遍历])