leetcode: 669. Trim a Binary Search Tree

来源:互联网 发布:淘宝卖家回复差评用语 编辑:程序博客网 时间:2024/06/04 17:54

题目解析:

题目链接:https://leetcode.com/problems/trim-a-binary-search-tree/description/

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.

给一个二叉搜索树,高低边界为L和R,修剪该二叉树使得其所有元素都在[L,R]区间里。你可能需要修改二叉树的根,所以结果必须返回修剪后二叉树的新根。

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
解题思路:

我做这类题目时偏好于新建一棵树,将符合条件的节点赋给新树。因此,遍历原树,如果节点符合边界条件,就赋给新树,如果不符合,就接着遍历,并且新树不参与遍历。

代码如下:

void trim(treeNode* root, treeNode* &root1, int L, int R){if (!root)return;if (root->val >= L&&root->val <= R){root1 = new treeNode;root1->val = root->val;trim(root->left, root1->left, L, R);trim(root->right, root1->right, L, R);}else{if (root->left){trim(root->left, root1, L, R);}if (root->right){trim(root->right, root1, L, R);}}}treeNode* trimBST(treeNode* root, int L, int R) {treeNode* root1;trim(root, root1, L, R);return root1;}

网上有人给出了在原树直接操作的代码,我贴上来学习一下。自己代码的不足在于没考虑二叉搜索树节点值之间的大小关系。简洁代码的思路是如果节点值在边界范围内,就把问题递归到左右子树。如果节点值root->val>R那么由于二叉树右子树所有节点值都比根节点大,因此,把整个右子树舍弃。如果节点值root->val<L,由于二叉树左子树所有节点值都比根节点小,因此,把整个右子树舍弃。

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode* trimBST(TreeNode* root, int L, int R) {        if(root == NULL)            return NULL;        if(root->val > R)            return trimBST(root->left, L, R);        if(root->val < L)            return trimBST(root->right, L, R);        root->left = trimBST(root->left, L, R);        root->right = trimBST(root->right, L, R);        return root;    }};


原创粉丝点击