目录
- 题目
- 1、不考虑BST性质,直接递归遍历
- 2、回顾BST性质
- 3、利用BST性质进行遍历
- 4、简单的迭代方法
题目
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
1、不考虑BST性质,直接递归遍历
/*** 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 {
private:TreeNode* NewRoot = NULL;TreeNode* traversal(TreeNode* root, int val){if(root == NULL) return NewRoot ;if(root->val == val){NewRoot = root;return NewRoot;} traversal(root->left,val);traversal(root->right,val);return NewRoot;}
public:TreeNode* searchBST(TreeNode* root, int val) {return traversal(root,val);}
};
2、回顾BST性质
二叉搜索树是一个有序树:
1、若它的左子树不空,则左子树上所有的结点的值均小于它的根结点的值
2、若它的右子树不空,则右子树上所有的结点的值均大于它的根结点的值
3、它的左右子树也分别为二叉搜索树
3、利用BST性质进行遍历
/*** 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* searchBST(TreeNode* root, int val) {//打印信息// if(root == NULL) cout<<"NULL"<<endl;// else cout<<root->val<<endl;//if(root == NULL || root->val == val) return root;if(root->val > val) return searchBST(root->left,val);if(root->val < val) return searchBST(root->right,val);//如果没有找到就返回NULLreturn NULL;}
};
因为搜索到了目标结点,就要立即return了,这样才是找到了结点就返回,如果此时不return就会遍历整棵树。
4、简单的迭代方法
由于BST的性质导致我们不需要用栈模拟深度或者队列模拟广度,甚至也不需要使用回溯的思想。因为树结点排列有序,你只要每到一个结点进行一次判断,就可以选择到正确的方向了。
class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {//打印信息// if(root == NULL) cout<<"NULL"<<endl;// else cout<<root->val<<endl;while(root!=NULL){//进行判断方向if(root->val > val) root=root->left;else if(root->val < val ) root=root->right;//如果不符合规则就返回根结点else return root;}//如果没有找到就返回NULLreturn NULL;}
};