【TOJ 1002】

描述

给定一棵二叉搜索树(Binary Search Tree,BST),以及一对整数x和y,将二叉树中不在区间[x, y]的节点修剪掉,求修剪后的BST树根节点值。

BST定义:

二叉搜索树,又称为二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

二叉树节点定义如下:

struct TreeNode {

    int val;

    struct TreeNode *left;

    struct TreeNode *right;

};

题目部分代码已经完成,您只需要补充并提交以下函数:

struct TreeNode* trimBST(struct TreeNode* root, int L, int R);

输入

输入第一行为整数n,表示关键字数目(n<500)。

第二行有n个整数,表示节点的关键字,按照该关键字顺序构建一棵BST。

第三行为x和y(x<=y)。

输出

输出修剪后根节点的值,数据保证修建后一定存在一个根节点。

样例输入

3
1 3 2
2 3

样例输出

3

题解

修剪一个二叉树:给定一个二叉树的最大和最小边界L和R,使树中的元素位于L和R之间。

1. 当root位于L和R之间时,递归的修剪其左右子树,并返回root。

2. 当root的值小于L,其左子树都小于L,故舍弃其左子树,递归的修剪其右子树,并返回修剪过的右子树。

3. 当root的值大于R,其右子树都大于R,故舍弃其右子树,递归的修剪其左子树,并返回修剪过的左子树。

#include<bits/stdc++.h>
using namespace std;
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};
void Insert(TreeNode**root,TreeNode*t)
{
    if(*root==NULL)
        *root=t;
    else if(t->val < (*root)->val)
        Insert(&(*root)->left,t);
    else Insert(&(*root)->right,t);
}
TreeNode*creatBst()
{
    TreeNode*root=NULL,*t;
    int x,i,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        t=(TreeNode*)malloc(sizeof(TreeNode));
        t->val=x;
        t->left=NULL;
        t->right=NULL;
        Insert(&root,t);
    }
    return root;
}
TreeNode* trimBST(struct TreeNode* root, int L, int R) { if(!root) return 0; if(root->val<L) return trimBST(root->right,L,R); else if(root->val>R) return trimBST(root->left,L,R); else { root->left=trimBST(root->left,L,R); root->right=trimBST(root->right,L,R); return root; } } int main() { TreeNode*t=creatBst(); int x,y; cin>>x>>y; printf("%d\n",trimBST(t,x,y)->val); return 0; }

猜你喜欢

转载自www.cnblogs.com/kannyi/p/9004754.html