2020.08.02 学习笔记—LeetCode 199 二叉树的 左视图,右视图 的 dfs & bfs 算法

389 阅读1分钟

LeetCode 199 二叉树的右边视图
leetcode.com/problems/bi…

举个例子如下:

Input: [1,2,3,null,5,null,4]

Output: [1, 3, 4]

Explanation:

    看到此题目第一想到的是分层遍历
    代码如下:
    //node的类定义
    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
    
    //方法实现
    
     public List<Integer> rightSideView(TreeNode root) {
        
        List<Integer> result = new LinkedList<>();
        //判空校验
        if (root == null) {
            return result;
        }

        LinkedList<TreeNode> temp = new LinkedList();
 		存放遍历元素的队列
        temp.add(root);
        while (!temp.isEmpty()) {
            //当前层剩余严肃的个数
            int size = temp.size();
            //是否弹出过第一个元素
            //此变量的位置一定要确定
            boolean  bool =  false;
            //判断当前的层次是否还有剩余元素
            while (size > 0) {
                //弹出队列的开头元素。这一步一直进行
                TreeNode node = temp.poll();
                if (node.right != null) {
                    temp.offer(node.right);
                }

                if (node.left != null) {
                    temp.offer(node.left);
                }
                int value  = node.val ;
                //如果本层没有弹出过元素,
                if (!bool) {
                    result.add(value);
                    //表示本层的队列元素已经弹出过
                    bool = true;
                }
                size--;
            }
        }

        return result;

    }

    //执行代码
	public  static void main(String [] args) {
    TreeNode root1 = new TreeNode(1);
        TreeNode root1 = new TreeNode(1);
        TreeNode root2 = new TreeNode(2);
        TreeNode root3 = new TreeNode(3);
        TreeNode root4 = new TreeNode(4);
        TreeNode root5 = new TreeNode(5);
        TreeNode root6 = new TreeNode(6);
        TreeNode root7 = new TreeNode(7);

        root2.right =root5;
        root3.right = root4;
        root1.right = root3;
        root1.left = root2;

        root5.left= root6;
        root3.left = root7;
        Object res =  new Test().rightSideView(root1);
        System.out.println(res);
    }

以上为第一中bfs遍历的方法。其实也可以用dfs遍历的方法。

   public List<Integer> rightSideView (TreeNode root) {
       List<Integer> result = new LinkedList();
       if (root == null) {
       	  return result;
       }
       
       dfs (root,result,1); 
       return result;
   } 
   
   /**
   */
   public void dfs (TreeNode root,List<Integer> list,int depth) {
        if (root == null) {
			return;
        }
        //如果当前节点,小于个数,表示当前深度没有被看到过。
        //因此需要把当前节点,接到结果中。
        if (list.size()<depth) {
             
            list.add(root.val);
        }
        
        dfs (root.right,list,depth+1);
        dfs (root.left,list,depth+1);
   }

如果要查看二叉树的左视图也可以。

只需要将 dfs的顺序调换即可

   public List<Integer> rightSideView (TreeNode root) {
       List<Integer> result = new LinkedList();
       if (root == null) {
          return result;
       }
       
       dfs (root,result,1); 
       return result;
   } 
   
   /**
   */
   public void dfs (TreeNode root,List<Integer> list,int depth) {
        if (root == null) {
            return;
        }
        //如果当前节点,小于个数,表示当前深度没有被看到过。
        //因此需要把当前节点,接到结果中。
        if (list.size()<depth) {
             
            list.add(root.val);
        }
        
        dfs (root.left,list,depth+1);
        dfs (root.right,list,depth+1);
   }