今天在装修我的GitHub主页……嗯……也是很费时的一件事……
而且组好了双屏,向着tech otaku迈进一大步!
日后补上装修过程
重复补齐一下前景提要:
距离我尽量维持一天一题已经过去了一个月,整个6月份都在忙期末作业、期末复习和期末实训,放暑假后一直在打电动,在装修博客,导致我一天一题是鸽了又鸽,状态全无。
这让本就是菜鸡的我,又彻底变回纯飞舞,还是连题目都读不太懂的那种。
所以我决心恢复往日的状态。
难度:中等
给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。
返回移除了所有不包含 1 的子树的原二叉树。
节点 node 的子树为 node 本身加上所有 node 的后代。
输入:root = [1,null,0,0,1]
输出:[1,null,0,null,1]
解释:
只有红色节点满足条件“所有不包含 1 的子树”。 右图为返回的答案。
输入:root = [1,0,1,0,0,0,1]
输出:[1,null,1,null,1]
输入:root = [1,1,0,1,1,0,1,0]
输出:[1,1,0,1,1,null,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;
}
}