博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Trim a Binary Search Tree 修剪一棵二叉搜索树
阅读量:6399 次
发布时间:2019-06-23

本文共 1948 字,大约阅读时间需要 6 分钟。

Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that all its elements lies in [L, R] (R >= L). You might need to change the root of the tree, so the result should return the new root of the trimmed binary search tree.

Example 1:

Input:     1   / \  0   2  L = 1  R = 2Output:     1      \       2

 

Example 2:

Input:     3   / \  0   4   \    2   /  1  L = 1  R = 3Output:       3     /    2     / 1

这道题让我们修剪一棵二叉搜索树,给了个边界范围[L, R], 所有不在这个范围内的结点应该被移除掉,但是仍需要保留二叉搜索树的性质,即左<根<右,有时候是小于等于。博主最开始的想法是先遍历一遍二叉树,将在返回内的结点值都放到一个数组后,遍历结束后再根据数组重建一棵二叉搜索树。这种方法会在某些test case上fail掉,可能会改变原来的二叉搜索树的结构,所以我们只能换一种思路。正确方法其实应该是在遍历的过程中就修改二叉树,移除不合题意的结点。当然对于二叉树的题,十有八九都是要用递归来解的。首先判断如果root为空,那么直接返回空即可。然后就是要看根结点是否在范围内,如果根结点值小于L,那么返回对其右子结点调用递归函数的值;如果根结点大于R,那么返回对其左子结点调用递归函数的值。如果根结点在范围内,将其左子结点更新为对其左子结点调用递归函数的返回值,同样,将其右子结点更新为对其右子结点调用递归函数的返回值。最后返回root即可,参见代码如下:

解法一:

public:    TreeNode* trimBST(TreeNode* root, int L, int R) {        if (!root) return NULL;        if (root->val < L) return trimBST(root->right, L, R);        if (root->val > R) return trimBST(root->left, L, R);        root->left = trimBST(root->left, L, R);        root->right = trimBST(root->right, L, R);        return root;    }};

下面这种方法是迭代的写法,虽然树的题一般都是用递归来写,简洁又美观。但是我们也可以强行用while来代替递归,比如下面这种写法: 

解法二:

public:    TreeNode* trimBST(TreeNode* root, int L, int R) {        if (!root) return NULL;        while (root->val < L || root->val > R) {            root = (root->val < L) ? root->right : root->left;        }        TreeNode *cur = root;        while (cur) {            while (cur->left && cur->left->val < L) {                cur->left = cur->left->right;            }            cur = cur->left;        }        cur = root;        while (cur) {            while (cur->right && cur->right->val > R) {                cur->right = cur->right->left;            }            cur = cur->right;        }        return root;    }};

参考资料:

本文转自博客园的博客,原文链接:

,如需转载请自行联系原博主。

你可能感兴趣的文章
angular controller as syntax vs scope
查看>>
【ZooKeeper Notes 10】ZooKeepr监控
查看>>
Windows Server 2008 将计算机加入到指定组织单元
查看>>
在VM2008R2中使用模板快速创建虚拟机之二实践篇
查看>>
DELPHI中对SQL SERVER中image、text字段的读写综述
查看>>
SSD硬盘配置最佳实践
查看>>
关于docker容器网络的一些理解
查看>>
二十年后的回眸(7)——成功的IT转型
查看>>
sys.version和sys.version_info 查看版本
查看>>
催化剂概念在管理领域的应用——来自项目管理群的讨论
查看>>
基于Linux平台Softimage XSI 演示
查看>>
细说Linux系统优化-实践篇
查看>>
Java应用中使用Proxool
查看>>
SEO深度解读之HITS链接分析算法
查看>>
Dom4j遍历解析XML测试
查看>>
WINHEX Scripts
查看>>
演示:引发的次优路径故障分析与排除
查看>>
[零基础学JAVA]Java SE应用部分-35.JAVA类集之三
查看>>
c++设计一个无法被继承的类
查看>>
Scrum为什么不喜欢“来自客户的频繁变更”?
查看>>