【树】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;
    }
}

 

posted @ 2020-10-15 00:15  3KBLACK  阅读(235)  评论(0)    收藏  举报