1. 程式人生 > >Leetcode-----814. 二叉樹剪枝

Leetcode-----814. 二叉樹剪枝

給定二叉樹根結點 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的子樹全部去掉。那麼先遞迴到樹的底部(葉子節點)然後如果如果這個葉子為0,那麼去掉,這樣自下而上的將不含1的子樹去除。 而且要被去掉的節點都在被去除之前有著同樣的特點,左右子樹全為NULL且val=0.

AC:

class Solution {
public:

 
    TreeNode* pruneTree(TreeNode* root) {
        if(root==NULL)
        {
            return NULL;
        }
        root->left=pruneTree(root->left);                  //這一句和下一句要寫在下面的if()上面,不然無法實現自下向上來將所有符合                                                                                             //條件的節點刪除,例如樣例輸入的第二個。


        root->right=pruneTree(root->right);
        if (root->left==NULL&&root->right==NULL&&root->val==0)
            return NULL;
        return root;
    }
};

 

自己寫雖然也能AC,但程式碼還是囉嗦,不簡潔,還很多,還很遠。