View on GitHub

SCRATCH PAD

No polish, just pulse

Striver’s SDE Sheet Notes (Day 17: Binary Tree)


1. Inorder Traversal

  public List<Integer> inorderTraversal(TreeNode root) {
      List<Integer> result = new ArrayList<>();
      inorder(root, result);
      return result;
  }
  
  private void inorder(TreeNode node, List<Integer> result) {
      if (node == null) return;
      inorder(node.left, result);
      result.add(node.val);
      inorder(node.right, result);
  }
  

2. Preorder Traversal

  public List<Integer> preorderTraversal(TreeNode root) {
      List<Integer> result = new ArrayList<>();
      preorder(root, result);
      return result;
  }
  
  private void preorder(TreeNode node, List<Integer> result) {
      if (node == null) return;
      result.add(node.val);
      preorder(node.left, result);
      preorder(node.right, result);
  }
  

3. Postorder Traversal

  public List<Integer> postorderTraversal(TreeNode root) {
      List<Integer> result = new ArrayList<>();
      postorder(root, result);
      return result;
  }
  
  private void postorder(TreeNode node, List<Integer> result) {
      if (node == null) return;
      postorder(node.left, result);
      postorder(node.right, result);
      result.add(node.val);
  }
  

4. Morris Inorder Traversal

  public List<Integer> morrisInorderTraversal(TreeNode root) {
      List<Integer> result = new ArrayList<>();
      TreeNode current = root;
      
      while (current != null) {
          if (current.left == null) {
              result.add(current.val);
              current = current.right;
          } else {
              TreeNode pre = current.left;
              while (pre.right != null && pre.right != current) {
                  pre = pre.right;
              }
              if (pre.right == null) {
                  pre.right = current;
                  current = current.left;
              } else {
                  pre.right = null;
                  result.add(current.val);
                  current = current.right;
              }
          }
      }
      
      return result;
  }
  

5. Morris Preorder Traversal

  public List<Integer> morrisPreorderTraversal(TreeNode root) {
      List<Integer> result = new ArrayList<>();
      TreeNode current = root;
      
      while (current != null) {
          if (current.left == null) {
              result.add(current.val);
              current = current.right;
          } else {
              TreeNode pre = current.left;
              while (pre.right != null && pre.right != current) {
                  pre = pre.right;
              }
              if (pre.right == null) {
                  result.add(current.val);
                  pre.right = current;
                  current = current.left;
              } else {
                  pre.right = null;
                  current = current.right;
              }
          }
      }
      
      return result;
  }
  

6. LeftView of Binary Tree

  public List<Integer> leftView(TreeNode root) {
      List<Integer> result = new ArrayList<>();
      if (root == null) return result;
      
      Queue<TreeNode> queue = new LinkedList<>();
      queue.add(root);
      
      while (!queue.isEmpty()) {
          int size = queue.size();
          for (int i = 0; i < size; i++) {
              TreeNode node = queue.poll();
              if (i == 0) result.add(node.val);
              if (node.left != null) queue.add(node.left);
              if (node.right != null) queue.add(node.right);
          }
      }
      
      return result;
  }
  

7. Bottom View of Binary Tree

  public List<Integer> bottomView(TreeNode root) {
      List<Integer> result = new ArrayList<>();
      if (root == null) return result;
      
      Map<Integer, Integer> map = new TreeMap<>();
      Queue<Pair<TreeNode, Integer>> queue = new LinkedList<>();
      queue.add(new Pair<>(root, 0));
      
      while (!queue.isEmpty()) {
          Pair<TreeNode, Integer> pair = queue.poll();
          TreeNode node = pair.getKey();
          int hd = pair.getValue();
          
          map.put(hd, node.val);
          
          if (node.left != null) queue.add(new Pair<>(node.left, hd - 1));
          if (node.right != null) queue.add(new Pair<>(node.right, hd + 1));
      }
      
      result.addAll(map.values());
      return result;
  }
  

8. Top View of Binary Tree

  public List<Integer> topView(TreeNode root) {
      List<Integer> result = new ArrayList<>();
      if (root == null) return result;
      
      Map<Integer, Integer> map = new TreeMap<>();
      Queue<Pair<TreeNode, Integer>> queue = new LinkedList<>();
      queue.add(new Pair<>(root, 0));
      
      while (!queue.isEmpty()) {
          Pair<TreeNode, Integer> pair = queue.poll();
          TreeNode node = pair.getKey();
          int hd = pair.getValue();
          
          if (!map.containsKey(hd)) {
              map.put(hd, node.val);
          }
          
          if (node.left != null) queue.add(new Pair<>(node.left, hd - 1));
          if (node.right != null) queue.add(new Pair<>(node.right, hd + 1));
      }
      
      result.addAll(map.values());
      return result;
  }
  

9. Preorder, Inorder, Postorder in a Single Traversal

Approach:**

  public List<List<Integer>> threeOrders(TreeNode root) {
      List<List<Integer>> result = new ArrayList<>();
      List<Integer> preorder = new ArrayList<>();
      List<Integer> inorder = new ArrayList<>();
      List<Integer> postorder = new ArrayList<>();
      
      traverse(root, preorder, inorder, postorder);
      result.add(preorder);
      result.add(inorder);
      result.add(postorder);
      
      return result;
  }
  
  private void traverse(TreeNode node, List<Integer> preorder, List<Integer> inorder, List<Integer> postorder) {
      if (node == null) return;
      
      preorder.add(node.val);
      traverse(node.left, preorder, inorder, postorder);
      inorder.add(node.val);
      traverse(node.right, preorder, inorder, postorder);
      postorder.add(node.val);
  }
  

10. Vertical Order Traversal

  public List<List<Integer>> verticalOrder(TreeNode root) {
      List<List<Integer>> result = new ArrayList<>();
      if (root == null) return result;
      
      Map<Integer, List<Integer>> map = new TreeMap<>();
      Queue<Pair<TreeNode, Integer>> queue = new LinkedList<>();
      queue.add(new Pair<>(root, 0));
      
      while (!queue.isEmpty()) {
          Pair<TreeNode, Integer> pair = queue.poll();
          TreeNode node = pair.getKey();
          int hd = pair.getValue();
          
          map.putIfAbsent(hd, new ArrayList<>());
          map.get(hd).add(node.val);
          
          if (node.left != null) queue.add(new Pair<>(node.left, hd - 1));
          if (node.right != null) queue.add(new Pair<>(node.right, hd + 1));
      }
      
      result.addAll(map.values());
      return result;
  }
  

11. Root to Node Path in Binary Tree

  public List<Integer> rootToNodePath(TreeNode root, int target) {
      List<Integer> path = new ArrayList<>();
      if (findPath(root, target, path)) {
          return path;
      }
      return new ArrayList<>();
  }
  
  private boolean findPath(TreeNode node, int target, List<Integer> path) {
      if (node == null) return false;
      
      path.add(node.val);
      
      if (node.val == target) return true;
      
      if (findPath(node.left, target, path) || findPath(node.right, target, path)) {
          return true;
      }
      
      path.remove(path.size() - 1);
      return false;
  }
  

12. Max Width of a Binary Tree

  public int maxWidth(TreeNode root) {
      if (root == null) return 0;
      
      Queue<TreeNode> queue = new LinkedList<>();
      queue.add(root);
      int maxWidth = 0;
      
      while (!queue.isEmpty()) {
          int size = queue.size();
          maxWidth = Math.max(maxWidth, size);
          
          for (int i = 0; i < size; i++) {
              TreeNode node = queue.poll();
              if (node.left != null) queue.add(node.left);
              if (node.right != null) queue.add(node.right);
          }
      }
      
      return maxWidth;
  }