【树】1325. 删除给定值的叶子节点
题目:
给你一棵以 root 为根的二叉树和一个整数 target ,请你删除所有值为 target 的 叶子节点 。
注意,一旦删除值为 target 的叶子节点,它的父节点就可能变成叶子节点;如果新叶子节点的值恰好也是 target ,那么这个节点也应该被删除。
也就是说,你需要重复此过程直到不能继续删除。

解答:
方法一:
/** * Definition for a binary tree node. * public 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; * } * } */ class Solution { public TreeNode removeLeafNodes(TreeNode root, int target) { postorder(root,null,target); if(root.left==null&&root.right==null&&root.val==target){ return null; } return root; } public void postorder(TreeNode root,TreeNode parent,int target){ if(root == null){ return; } postorder(root.left,root,target); postorder(root.right,root,target); if(root.left == null&&root.right == null){ if(parent != null){ if(root.val == target){ if(parent.left == root){ parent.left = null; }else{ parent.right = null; } } } } } }
注意下面这个代码的错误之处:
class Solution { public TreeNode removeLeafNodes(TreeNode root, int target) { postorder(root,null,target); return root; } public void postorder(TreeNode root,TreeNode parent,int target){ if(root == null){ return; } postorder(root.left,root,target); postorder(root.right,root,target); if(root.left == null&&root.right == null){ if(parent == null){ if(root.val == target){ //这里给root赋值为null,并不是对root本身的操作,只是对一个副本的操作,所以返回调用者的代码后这个赋值语句无效 root = null; } } else{ if(root.val == target){ if(parent.left == root){ parent.left = null; }else{ parent.right = null; } } } } } }
方法二:
/** * Definition for a binary tree node. * public 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; * } * } */ class Solution { public TreeNode removeLeafNodes(TreeNode root, int target) { return postorder(root,target); } public TreeNode postorder(TreeNode root,int target){ if(root == null){ return null; } TreeNode left = postorder(root.left,target); TreeNode right = postorder(root.right,target); //改变树的结构 root.left = left; root.right = right; if(left==null&&right==null&root.val==target){ return null; } return root; } }

浙公网安备 33010602011771号