題目描述
給定二叉樹根結點 root ,此外樹的每個結點的值要麼是 0,要麼是 1。
返回移除了所有不包含 1 的子樹的原二叉樹。
( 節點 X 的子樹爲 X 本身,以及所有 X 的後代。)
示例:
示例1:
輸入: [1,null,0,0,1]
輸出: [1,null,0,null,1]
解釋:
只有紅色節點滿足條件“所有不包含 1 的子樹”。
右圖爲返回的答案。
示例2:
輸入: [1,0,1,0,0,0,1]
輸出: [1,null,1,null,1]
示例3:
輸入: [1,1,0,1,1,0,1,0]
輸出: [1,1,0,1,1,null,1]
說明:
- 給定的二叉樹最多有 100 個節點。
- 每個節點的值只會爲 0 或 1 。
算法思想: 樹的題目一般都可以用遞歸來做,刪除不包含1的子樹,如果節點爲空,那麼可以直接判定以該節點爲根節點的子樹是需要剪的“枝”,否則,依次判斷其左子樹右子樹和自身值是否符合剪枝要求,如果左右子樹符合題目要求則直接將其賦值爲null。
代碼實現:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* pruneTree(struct TreeNode* root){
bintree(root);
return root;
}
int bintree(struct TreeNode* r)
{
if(!r)
return 0;
if(!bintree(r->left))
r->left = NULL;
if(!bintree(r->right))
r->right = NULL;
if(r->left || r->right || r->val)
return 1;
return 0;
}
算法性能分析:
原文鏈接: https://www.jhxblog.cn/article/?articleid=23