描述
给定一棵二叉搜索树(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; }