We are given the head node root
of a binary tree, where additionally every node's value is either a 0 or a 1.html
Return the same tree where every subtree (of the given tree) not containing a 1 has been removed.node
(Recall that the subtree of a node X is X, plus every node that is a descendant of X.)函数
Example 1: Input: [1,null,0,0,1] Output: [1,null,0,null,1] Explanation: Only the red nodes satisfy the property "every subtree not containing a 1". The diagram on the right represents the answer.
Example 2: Input: [1,0,1,0,0,0,1] Output: [1,null,1,null,1]
Example 3: Input: [1,1,0,1,1,0,1,0] Output: [1,1,0,1,1,null,1]
Note:spa
100 nodes
.0
or 1
.
这道题给了咱们一棵二叉树,说是结点只有0或者1,让咱们移除全部没有含有结点1的子树。题目中也给了一些图例,不难理解。这道题的难点就在于怎么看待没有结点1的子树,咱们知道子树也是由一个个结点组成的,须要明确的是一个单独的叶结点也可算做是子树,因此值为0的叶结点必定要移除,就像上面的例子1和3中的几个叶结点要被移除同样。对于例子2来讲,若是移除了第三行的3个叶结点后,那么第二行的那个值为0的结点也变成了叶结点,继续移除便可,因此与其找值全为0的子树,咱们能够不断的移除值为0的叶结点,全都移除后那么值全为0的子树也就都被移除了。code
好,想通了这一点后,咱们看如何来实现。对于玩二叉树的题,十有八九都是用递归,因此咱们应该首先就考虑递归的解法,而后再想按什么顺序来遍历二叉树呢?层序,先序,中序,仍是后序?根据这道题的特色,咱们要从末尾来一层一层的移除值为0的叶结点,因此自然时候用后序遍历。那么想到这里,解题思路跃然纸上了吧,咱们首先对结点判空,若是不存在,直接返回空。而后分别对左右子结点调用递归函数,此时判断,若是当前结点是值为1的叶结点,那么移除该结点,即返回空,不然返回原结点便可,参见代码以下:htm
class Solution { public: TreeNode* pruneTree(TreeNode* root) { if (!root) return NULL; root->left = pruneTree(root->left); root->right = pruneTree(root->right); return (!root->left && !root->right && root->val == 0) ? NULL : root; } };
参考资料:blog
https://leetcode.com/problems/binary-tree-pruning/递归