一开始的思路是凭借一个pre指针,pre指针指向当前遍历节点的父节点,然后当发现该节点不符合要求时,利用二叉搜索树的性质,若该节点是小于左边界的,则它的左子树也势必不符合要求,此时将该节点的父节点指向该节点的右子树。当该节点的值大于r时同理。但是没成功,自己没想到这种方法的解决办法,感觉一个原因是因为根节点的父节点这个问题不好处理。但是这种带着父节点参数的问题以后还是要注意总结。
class Solution {
public:
void dfs(TreeNode* pre,TreeNode* root, int L, int R)
{
if(root==NULL) return;
dfs(root,root->left,L,R);
if(root->val<L)//那么root的左子树就不用看了
{
if(root->left!=NULL) root->left=NULL;
pre->left=root->right;
}
else if(root->val>R)//那么root的右子树就不用看了
{
if(root->right!=NULL) root->right=NULL;
pre->right=root->left;
}
dfs(root,root->right,L,R);
}
TreeNode* trimBST(TreeNode* root, int L, int R) {
dfs(root,root,L,R);
return root;
}
};
感觉最近做的树的相关题目,都是在dfs里面进行操作,且没加返回值,这样不加返回值的做法,经常出问题。
下面贴一段比较正派的思路
TreeNode* trimBST(TreeNode* root, int L, int R) {
if(!root){
return root;
}
if(root->val < L){//current val < border L, use right tree
return trimBST(root->right,L,R);
}
if(root->val >R){//current val > border R, use LEFT tree
return trimBST(root->left,L,R);
}
root->left = trimBST(root->left,L,R);
root->right = trimBST(root->right,L,R);
return root;
}
所以不只是不加返回值的操作要会,这种带返回值的也要会。这里要想明白一个问题,即我们题目要求的断链,接链操作,是通过,不是靠自己接链来做的,而是靠返回指针来实现的。(这个地方必须重点注意)
我自己用样例想了想,发现这样依靠返回指针是可以的。