题目描述
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
给定二叉搜索树:
4
/ \
2 7
/ \
1 3
和值: 2
你应该返回如下子树:
2
/ \
1 3
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-a-binary-search-tree
修改后的解答
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
// Definition for a binary tree node.
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class 二叉树搜索树中的搜索 {
/**
* 1.遍历二叉查找树
* 先序遍历 根左右 √
* 中序遍历 左根右
* 后序遍历 左右根
* 2.查找指定节点,返回该节点为根的子树
* 如何返回子树?直接将指定节点返回即可
*/
/**
* 非递归先序遍历二叉搜索树
* 借助栈实现
* 原文链接:https://blog.csdn.net/u010651249/article/details/88265589
* @param root
* @return
*/
public static List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ret = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node == null) continue;
ret.add(node.val);
System.out.println(node.val);
stack.push(node.right); // 先右后左,保证左子树先遍历
stack.push(node.left);
}
return ret;
}
/**
* 递归先序遍历二叉搜索树
* 深度遍历
*
* 递归遍历二叉树(Recursively traversing the binary tree)
* @param p 当前节点
*
*/
public static void recursiveTraverTree(TreeNode p){
System.out.println(p.val);
if(p.left!=null){
recursiveTraverTree(p.left);
}
if(p.right!=null){
recursiveTraverTree(p.right);
}
}
/**
* 递归查找符合值的节点 并返回相应子树
* 在查找的时候要注意二叉查找树的特点:
* 根节点的值,比左孩子节点值大,比右孩子节点值小
*
* @param p
* @return 返回找到值的对应子树
*/
public static TreeNode recursiveSearchTree(TreeNode p,int n){
if(p==null){
return null;
}
if(n==p.val) {
return p;
}else if(n<p.val){//当前节点值大于所要寻找的值 继续在左子树中寻找
return recursiveSearchTree(p.left,n);
}else{//当前节点值小于所要寻找的值 继续在右子树中寻找
return recursiveSearchTree(p.right,n);
}
}
public static void main(String[] args) {
TreeNode a=new TreeNode(4);
a.left=new TreeNode(2);
a.right=new TreeNode(7);
a.left.left=new TreeNode(1);
a.left.right=new TreeNode(3);
TreeNode p=recursiveSearchTree(a,2);
recursiveTraverTree(p);
// preorderTraversal(p);
}
}