京东素质面没过,离谱到家了。。

93a950f1df258ca927ec541e70226559.gif

精品推荐

《征服数据结构》专栏:50多种数据结构彻底征服

《经典图论算法》专栏:50多种经典图论算法全部掌握

一网友在京东面试,测评,笔试,小组面,专业面,都过了,一路畅通无阻,结果在素质面的时候给挂了,网友评论道:离谱他妈给离谱开门,真是离谱到家了。还有的网友说:京东没素质,有素质的人他不要。

我很好奇素质面是怎么面的,通过回答问题就能判断一个人有没有素质吗?前面几轮都过了,说明专业性没问题,还搞个素质面,真的是多余,关键还给人家挂了。

91a1c2ac9b8e76d2632f846480956bd6.png

ff83b443e8dfb9bdf9dc2ece40e6c59b.png

454cc37d3fee0eb90aee9f64b679f191.png

49328b18c731a54947a556d5a47a0676.png

--------------下面是今天的算法题--------------

扫描二维码关注公众号,回复: 17406218 查看本文章

来看下今天的算法题,这题是LeetCode的第814题:二叉树剪枝。

问题描述

来源:LeetCode第814题

难度:中等

给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。返回移除了所有不包含 1 的子树的原二叉树。节点 node 的子树为 node 本身加上所有 node 的后代。

示例1:

cc3ff9e51714b76278ae46826406f299.png

输入:root = [1,null,0,0,1]

输出:[1,null,0,null,1]

解释

只有红色节点满足条件“所有不包含 1 的子树”。右图为返回的答案。

示例2:

b64f815a36dc3cd1d1c6b7e23015fed9.png

输入:root = [1,0,1,0,0,0,1]

输出:[1,null,1,null,1]

  • 树中节点的数目在范围 [1, 200] 内

  • Node.val 为 0 或 1

问题分析

这题说的是如果一颗子树所有节点值都是 0 ,就把这棵子树给删除。如果子树中只要有一个节点为 1 ,这棵子树就不能删除。

我们可以从下往上遍历二叉树,因为最下层的就是叶子节点,如果它是 0 ,把它删除就行了。从下往上遍历的时候,有的节点不是叶子节点,有可能子节点被删除之后,它就变成了叶子节点。

所以这里我们只需要对叶子节点操作即可,二叉树从下往上遍历可以使用后序遍历的方式,代码比较简单,我们来看下。

JAVA:

// 从下往上操作二叉树,参考二叉树的后序遍历
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;// 否则不要删除,直接返回
}

C++:

// 从下往上操作二叉树,参考二叉树的后序遍历
public:
    TreeNode *pruneTree(TreeNode *root) {
        if (!root)
            return nullptr;
        // 当前节点可能不是叶子节点,但如果他的子节点
        // 都删除完了,它就变成了叶子节点。
        root->left = pruneTree(root->left);// 剪枝左子树
        root->right = pruneTree(root->right);// 剪枝右子树
        // 如果叶子节点的值是0,就把他给删除,返回一个空的节点
        if (!root->left && !root->right && !root->val)
            return nullptr;
        return root;// 否则不要删除,直接返回
    }

Python:

# 从下往上操作二叉树,参考二叉树的后序遍历
def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
    if not root:
        return root
    #  当前节点可能不是叶子节点,但如果他的子节点
    #  都删除完了,它就变成了叶子节点。
    root.left = self.pruneTree(root.left)  # 剪枝左子树
    root.right = self.pruneTree(root.right)  # 剪枝右子树
    #  如果叶子节点的值是0,就把他给删除,返回一个空的节点
    if not root.left and not root.right and root.val == 0:
        return None
    return root  # 否则不要删除,直接返回

2d18397e99bc9f26bf923b97dde5a0ca.gif

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

《征服数据结构》专栏

数组稀疏表(Sparse Table)单向链表双向链表块状链表跳表队列和循环队列双端队列单调队列单调栈双端栈散列表字典树(Trie树)ArrayMapSparseArray二叉树二叉搜索树(BST)笛卡尔树AVL树树堆(Treap)FHQ-Treap

……

《经典图论算法》专栏

图的介绍图的表示方式邻接矩阵转换广度优先搜索(BFS)深度优先搜索(DFS)A*搜索算法迭代深化深度优先搜索(IDDFS)IDA*算法双向广度优先搜索迪杰斯特拉算法(Dijkstra)贝尔曼-福特算法(Bellman-Ford)SPFA算法弗洛伊德算法(Floyd)

……

猜你喜欢

转载自blog.csdn.net/abcdef314159/article/details/142537151