思路:
每次先判断根节点是否为空,为空直接返回,否则就判断根节点的值,在范围内就分别对左右子树进行判断,否则,例如根节点值小于L,那么这个结点左边所有的子树都不需要再判断了,因为这是二叉搜索树,根节点左边所有结点的值都小于该根节点的值
递归就完事了
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
} TreeNode,*SearchTree,*Position;
void PreOrderTraversal(SearchTree T)
{
if(T==NULL)
return;
cout<<T->val<<" ";
PreOrderTraversal(T->left);
PreOrderTraversal(T->right);
}
SearchTree Insert(int val,SearchTree T)
{
if(T==NULL)
{
T = (SearchTree)malloc(sizeof(TreeNode));
if(T==NULL)
{
cout<<"MALLOC ERROR\n"<<endl;
exit(1);
}
T->val = val;
T->left = T->right = NULL;
}
else
{
if(val>T->val)
T->right = Insert(val,T->right);
else if(val<T->val)
T->left = Insert(val,T->left);
}
return T;
}
class Solution
{
public:
TreeNode* trimBST(TreeNode* root, int L, int R)
{
if(root==NULL)
return NULL;
else if(root->val>= L && root->val<=R)
{
root->left = trimBST(root->left,L,R);
root->right = trimBST(root->right,L,R);
return root;
}
else
return root->val<L ?
trimBST(root->right,L,R):trimBST(root->left,L,R);
}
};
int main()
{
Solution s;
SearchTree T1 = NULL;
SearchTree T2 = NULL;
T1 = Insert(3,T1);
T1 = Insert(0,T1);
T1 = Insert(4,T1);
T1 = Insert(2,T1);
T1 = Insert(1,T1);
// T1 = Insert(6,T1);
// T1 = Insert(9,T1);
PreOrderTraversal(T1);
cout<<endl;
T2 = s.trimBST(T1,1,3);
PreOrderTraversal(T2);
return 0;
}