private void completeTree(boolean ancestorFileExist) {
      if (left == null && right == null) {
        return;
      }
      // if any ancestor of this node or this node itself contains any file, this node must be
      // balance
      boolean thisNodeMustBalance = ancestorFileExist || fileExist();
      if (thisNodeMustBalance) {
        // fill and empty node if left or right node not exist
        if (left == null) {
          left = new FileTree(node.left());
        }
        if (right == null) {
          right = new FileTree(node.right());
        }
      }
      if (left != null) {
        left.completeTree(ancestorFileExist || fileExist());
      }
      if (right != null) {
        right.completeTree(ancestorFileExist || fileExist());
      }
    }
Complete this binary tree to make every subTree of this Tree As a Full Binary Tree(FBT), if
any data exists in this subTree.

<p>A Full Binary Tree(FBT) is a binary tree in which all the nodes have either 0 or 2
offspring. In other terms, it is a binary tree in which all nodes, except the leaf nodes,
have two offspring.

<p>To Complete the tree is to avoid ancestor node's data can't be covered when split subTree.
amoro-format-iceberg/src/main/java/org/apache/amoro/optimizing/plan/MixedIcebergPartitionPlan.java