二叉樹剪枝——LeetCode

題目描述

給定二叉樹根結點 root ,此外樹的每個結點的值要麼是 0,要麼是 1。

返回移除了所有不包含 1 的子樹的原二叉樹。

( 節點 X 的子樹爲 X 本身,以及所有 X 的後代。)

示例:

示例1:
輸入: [1,null,0,0,1]
輸出: [1,null,0,null,1]
解釋:
只有紅色節點滿足條件“所有不包含 1 的子樹”。
右圖爲返回的答案。
1

示例2:
輸入: [1,0,1,0,0,0,1]
輸出: [1,null,1,null,1]
2

示例3:
輸入: [1,1,0,1,1,0,1,0]
輸出: [1,1,0,1,1,null,1]
3

說明:
  • 給定的二叉樹最多有 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章