public class Solution
{
public TreeNode RemoveLeafNodes(TreeNode root, int target)
{
Stack<(TreeNode, TreeNode)> st = new();
TreeNode dummy = new(0, root, null);
BFS(root, dummy, st);
while (st.Count > 0)
{
var (node, parent) = st.Pop();
if (node.left == null && node.right == null && node.val == target)
{
node.val = int.MaxValue;
if (parent.left?.val == int.MaxValue)
{
parent.left = null;
}
if (parent.right?.val == int.MaxValue)
{
parent.right = null;
}
}
}
return dummy.left;
}
private void BFS(TreeNode root, TreeNode dummy, Stack<(TreeNode, TreeNode)> st)
{
Queue<TreeNode> q = new();
q.Enqueue(root);
st.Push((root, dummy));
while (q.Count > 0)
{
TreeNode node = q.Dequeue();
if (node.left != null)
{
q.Enqueue(node.left);
st.Push((node.left, node));
}
if (node.right != null)
{
q.Enqueue(node.right);
st.Push((node.right, node));
}
}
}
}