前往闪闪の小窝以获得更好的阅读和评论体验
一、前景提要
今天在装修我的GitHub主页……嗯……也是很费时的一件事……
而且组好了双屏,向着tech otaku迈进一大步!
效果图:
日后补上装修过程
重复补齐一下前景提要:
距离我尽量维持一天一题已经过去了一个月,整个6月份都在忙期末作业、期末复习和期末实训,放暑假后一直在打电动,在装修博客,导致我一天一题是鸽了又鸽,状态全无。
这让本就是菜鸡的我,又彻底变回纯飞舞,还是连题目都读不太懂的那种。
所以我决心恢复往日的状态。
二、题目
难度:中等
给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。
返回移除了所有不包含 1 的子树的原二叉树。
节点 node 的子树为 node 本身加上所有 node 的后代。
示例1:
输入:root = [1,null,0,0,1]
输出:[1,null,0,null,1]
解释:
只有红色节点满足条件“所有不包含 1 的子树”。 右图为返回的答案。
示例2:
输入:root = [1,0,1,0,0,0,1]
输出:[1,null,1,null,1]
示例3:
输入:root = [1,1,0,1,1,0,1,0]
输出:[1,1,0,1,1,null,1]
提示:
- 树中节点的数目在范围 [1, 200] 内
- Node.val 为 0 或 1
三、解答
看到二叉树,第一反应就是想想能不能用回溯算法
题目的要求:如果有一个二叉树,他的子树里没有1,删掉这个二叉树
思路:一个点去往下找下一个点看看符不符合条件再往上返回,回溯(递归)算法的基操
1,回溯算法
/**
* 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 pruneTree(TreeNode root) {
if(root == null) {
return null;
}
//看看左子树
root.left = pruneTree(root.left);
//看看右子树
root.right = pruneTree(root.right);
//1,如果是叶子节点,左右子树都为null,自己本身的val又为0,那就返回null给父节点
//2,如果不是叶子节点,自己的左右子树都返回null,也就意味着自己的子树里没有值为1的节点
// 然后自己如果val为0,那自己就是得被删的那棵树,也返回null
if(root.left == null && root.right == null && root.val == 0) {
return null;
}
//能走到这说明子树里有1或者
//本身的值为1(如果为0的子树那早已经删掉了,也就是返回null值了)
//此时正常返回即可,最终会返回最初的root节点
return root;
}
}
2,官方解法
之前做过剪枝的变种题,原题做起来还行
看看官方题解
一样,那没事了。