简介
二叉搜索树的查找主要包含查找指定元素的节点,最大值与最小值,和指定节点的前驱节点或者后驱节点。
具体流程
二叉搜索树查找节点
/**
* 二叉搜索树,查找节点,递归方法.
*
* @param root 根节点
* @param key 查找的key
* @return
*/
private Node bstree_search(Node root,int key){
if (root.getData()==key||root==null){
return root;
}
if (root.getData()<key)
return bstree_search(root.getRightNode(),key);
else
return bstree_search(root.getLeftNode(),key);
}
/**
* 二叉搜索树,查找节点,非递归方法.
* @param root 根节点
* @param key 查找的key
* @return
*/
private Node iterative_bstree_search(Node root,int key){
while(root!=null&&root.getData()!=key){
if (root.getData()>key)
root = root.getLeftNode();
else
root = root.getRightNode();
}
return root;
}
二叉搜索树查找最大值
/**
*查找二叉搜索树中的最大值.
* @param root 根节点
* @return
*/
private Node bstree_maximum(Node root){
if(root!=null&&root.getRightNode()!=null){
return bstree_maximum(root.getRightNode());
}
return root;
}
二叉搜索树查找前驱节点
/**
* 查找前驱节点.
* @param root 当前节点
* @return
*/
private Node bstree_backcessor(Node root){
//判断节点x是否有左子树,如果有左子树,则其左子树的最大节点是x的前驱
if (root.getRightNode()!=null){
return bstree_maximum(root.getLeftNode());
}
//如果没有左子树,则分为该节点是其父右节点的左孩子还是右孩子
Node parent = root.getParentNode();
while(parent!=null&&parent.getLeftNode()==root){
root = parent;
parent = root.getParentNode();
}
return parent;
}
节点类
public class Node {
private int data;
private Node leftNode;
private Node rightNode;
private Node parentNode;
public Node(int data,Node leftNode,Node rightNode,Node parentNode){
this.data= data;
this.leftNode = leftNode;
this.rightNode = rightNode;
this.parentNode = parentNode;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getLeftNode() {
return leftNode;
}
public void setLeftNode(Node leftNode) {
this.leftNode = leftNode;
}
public Node getRightNode() {
return rightNode;
}
public void setRightNode(Node rightNode) {
this.rightNode = rightNode;
}
public Node getParentNode() {
return parentNode;
}
public void setParentNode(Node parentNode) {
this.parentNode = parentNode;
}
}