Question
Given the root
of a binary tree, return the same tree where every subtree (of the given tree) not containing a 1
has been removed.
A subtree of a node node
is node
plus every node that is a descendant of node
.
Solution 1
DFS搜索,首先递归两个子节点。
在搜索时如果节点为0且两个子节点均为null,则返回null。否则返回节点本身。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
class Solution { public TreeNode pruneTree(TreeNode root) { if(root == null) return null; root.left = pruneTree(root.left); root.right = pruneTree(root.right); if(root.left == null && root.right == null && root.val == 0) return null; else return root; } }
|
Solution 2
DFS搜索,返回子节点和自己中是否包含1。
如果节点为null,则返回false。
如果自己为1,则返回true。
否则返回两个子节点中是否有true。
BFS搜索,根据每个节点的子节点是否包含1来决定左右子节点是否保存。
如果没有1,则将对应的子节点修改为null。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
class Solution { public TreeNode pruneTree(TreeNode root) { if(!hasOne(root)) return null; Queue<TreeNode> q = new LinkedList<>(); q.add(root); while(!q.isEmpty()){ TreeNode curr = q.poll(); if(hasOne(curr.left)) q.add(curr.left); else curr.left = null; if(hasOne(curr.right)) q.add(curr.right); else curr.right = null; } return root; } private boolean hasOne(TreeNode root){ if(root == null) return false; if(root.val == 1) return true; else return hasOne(root.left) || hasOne(root.right); } }
|