当前位置:首页 » 《随便一记》 » 正文

LeetCode 814. 二叉树剪枝_数据结构和算法

7 人参与  2021年11月18日 16:03  分类 : 《随便一记》  评论

点击全文阅读


截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666

在这里插入图片描述
在这里插入图片描述

这题是说如果二叉树的任一节点的左子树都是0,就把他的左子树删除,同理如果右子树都是0,也把他的右子树给删除。


这题常规思路是从根节点开始统计他的左右子树节点是否都是0,如果任一子树的所有节点都是0,就把他给删除。否则不能删除,然后再统计不能删除节点的子节点……,那这样的话工作量就非常大,并且还会出现大量重复计算,如下图所示:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
上面方式明显是行不通的。我们可以这样来思考一下,从上到下删不行,那么从下到上呢,如果是叶子节点并且值为0,我们就把他给删除,否则不要删除,看下视频,视频链接
在这里插入图片描述
看到这里大家可能就明白了,这就是二叉树的后续遍历,我们来看下代码

public TreeNode pruneTree(TreeNode root) {
    if (root == null)
        return null;
    //这里要注意,当前节点可能不是叶子节点,但如果他的子节点
    //都删除完了,它就变成了叶子节点。
    //剪枝左子树
    root.left = pruneTree(root.left);
    //剪枝右子树
    root.right = pruneTree(root.right);
    //如果叶子节点的值是0,就把他给删除,返回一个空的节点
    if (root.left == null && root.right == null && root.val == 0)
        return null;
    //否则不要删除,直接返回即可
    return root;
}

时间复杂度O(n)n是二叉树中节点的个数。
空间复杂度O(h)h是树的高度,也是递归的深度。


点击全文阅读


本文链接:http://zhangshiyu.com/post/31011.html

子树  节点  删除  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1