二叉搜索树的查找、添加和删除操作

原创 2016年08月29日 18:45:31
class Node{
	int data;
	Node lChild;
	Node rChild;
	
	public Node(int data){
		this.data=data;
		this.lChild=null;
		this.rChild=null;
	}
}

public class Tree {
	
	public static void main(String[] args) {
		Node n1=new Node(45);
		Node n2=new Node(12);
		Node n3=new Node(53);
        Node n4=new Node(3);
        Node n5=new Node(37);
        Node n6=new Node(100);
        Node n7=new Node(24);
        Node n8=new Node(61);
        Node n9=new Node(90);
        Node n10=new Node(78);
        
        Node root=n1;
        root.lChild=n2;
        root.rChild=n3;
        n2.lChild=n4;
        n2.rChild=n5;
        n3.rChild=n6;
        n5.lChild=n7;
        n6.lChild=n8;
        n8.rChild=n9;
        n9.lChild=n10; 
       
        System.out.println(delete(root,n2.data));
	}

	/**
	 * 在二叉树中查找节点
	 * @param root 当前搜索节点
	 * @param num 查找的值
	 * @param f  当前搜索节点父节点
	 * @return 若找到节点,则返回该节点,否则返回空
	 */
	public static Node search(Node root,int num){
		if(root==null){	                     
			return null;   
		}
		if(root.data>num){
			return search(root.lChild,num);
		}else if(root.data<num){
			return search(root.rChild,num);
		}else{
			return root;
		}
	}
	
	/**
	 * 得到某一数值的节点的父节点
	 * @param root 根节点
	 * @param num  特定的数值
	 * @return  返回特定数值的根节点
	 */
	public static Node getFather(Node root,int num){
		if(root==null){
			return null;
		}
		if(root.data==num){
			return root;
		}
		Node temp=root;
		Node father = null;
		while(temp!=null){ 
			father=temp;
			if(temp.data<num){
				temp=temp.rChild;
			}else{
				temp=temp.lChild;
			}
			if(temp==null||temp.data==num){  //找到特定节点或者特定节点不存在
				break;
			}
		}
		return father;
	}
	
	/**
	 * 在已有的二叉树中插入新节点
	 * @param root 根节点
	 * @param num 待插入的数据
	 * @return root为空或此数据已存在返回false
	 */
	public static boolean insert(Node root,int num){
		if(root!=null){
			Node p=search(root,num);
			if(p==null){
				Node node=new Node(num);
				Node father=getFather(root,num);
				if(father.data>num)
					father.lChild=node;
				else
					father.rChild=node;
				return true;
			}else{  //树中已有此数据
				return false;
			}
		}
		return false;
	}
	
	/**
	 * 删除节点:
	 * (1)删除的节点为叶子节点:直接删除节点,将其父节点的引用置空
	 * (2)删除的节点有左子树或者有右子树:直接将其父节点的引用指向其子树
	 * (3)删除的节点有左右子树:找到其右子树上的最小节点,将其父节点的引用指向最小节点,连接
	 * 其左右子树
	 * @param root 根节点
	 * @param num 要删除的节点的数值
	 * @return 返回删除操作成功与否
	 */
	public static boolean delete(Node root,int num){
		Node father;
		Node next;
		Node f;
		Node p=search(root,num);
		boolean left=false;
		if(p==null){ //此二叉树中不存在要删除的节点
			return false;
		}
		if(root.data==num&&root.lChild==null&&root.rChild==null){ //如果要删除的是根节点
			root.data=0;  //且根节点是叶子节点,则将根节点数据置0
			return true;
		}
		father=getFather(root,num);
		if(father.data>p.data){
			left=true;
		}
		if(p.lChild==null&&p.rChild==null){ //要删除的节点为叶子节点
			if(left){
				father.lChild=null;
			}else{
				father.rChild=null;
			}
		}else if(p.lChild!=null&&p.rChild==null){ //左孩子不为空,右孩子为空
			if(left){
				father.lChild=p.lChild;
			}else{
				father.rChild=p.lChild;
			}
		}else if(p.lChild==null&&p.rChild!=null){ //左孩子为空,右孩子不为空
			if(left){
				father.lChild=p.rChild;
			}else{
				father.rChild=p.rChild;
			}
		}else{ //左右孩子均不为空
			f=p;
			next=p.rChild;
			while(next.lChild!=null){ //找到要删除的节点右子树上的最小节点,并记录其父节点
				f=next;
				next=next.lChild;
			}
			if(p==root){ //如果删除的是根节点
				root.data=next.data;
				if(f!=root){
					root.rChild=f.rChild;
					f.lChild=null;
				}else{
					root.rChild=next.rChild;
				}
				return true;
			}
			if(f==p){ //如果要删除节点的右子树上没有左子树
				f.rChild=null;
				next.rChild=null;
			}else{
				f.lChild=null;
				next.rChild=p.rChild; //连接右子树
			}
			next.lChild=p.lChild; //连接左子树
			if(left){
				father.lChild=next;
			}else{
				father.rChild=next;
			}
		}
		return true;
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

二叉搜索树的插入,删除,查找操作

//头文件 //BinaryTreeNode.h #ifndef BINARYTREENODE_H #define BINARYTREENODE_H template class BinaryTree...

二叉搜索树的查找、插入、删除操作

对于查找和插入操作相对来说比较简单,删除操作则需要考虑的情况较多。 比如有以下些情况,可能有些可以合并,但是我没想到更好的方法,因此代码里有一堆if else,虽然我不喜欢写这样的代码,但也没找到更好...

二叉搜索树的查找与删除一些基本操作

二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子...

二叉搜索树的相关操作:插入节点,删除节点,排序,查找,最大值,最小值,前序,中序,后序遍历(主要用到递归的方法)

#include #include using namespace std; typedef int ElemType; typedef struct BSTNode//二叉搜索数的结点:左 ...

数据结构与算法分析--二叉排序树(二叉查找树,二叉搜索树)的查找、插入和删除操作

什么是二叉排序树 它表示一棵二叉树,并且包含以下性质: 1)可能是一棵空树 2)若不为空,那么其左子树结点的值都是小于根结点的值,右子树结点的值都是大于根结点的值 3)左右子树都是二叉树。 对...

[C++]数据结构:平衡的二叉搜索树之AVL树的结构特点与基础插入删除操作

在向大家介绍AVL树之前,我们先来看一下二叉搜索树的缺点。 BST的高度受输入顺序影响会有比较大的波动。 最好的高度为O(log n): 最坏的高度为O(n): 这样不稳定的结构不是我们想要的数...

Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作

1、首先,需要一个节点对象的类。这些对象包含数据,数据代表存储的内容,而且还有指向节点的两个子节点的引用 class Node { public int iData; public double ...

二叉搜索树的查询、插入与删除操作(Binary Search Tree, Search, Insert, Delete)(C++)

一、概念     设 x 是二叉搜索树中的一个结点。如果 y 是 x 左子树中的一个结点,那么 y.key ≦ x.key。如果 y 是 x 右子树中的一个结点,那么 y.key ≧ x.key。 ...

二叉搜索树(BST)的常用操作:建树、插入、查询、删除、排序打印

/* Author:Ibsen Data:2015.12.21 */ //二叉搜索树:建树,插入,删除,排序输出. #include #include using namespace std; c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉搜索树的查找、添加和删除操作
举报原因:
原因补充:

(最多只允许输入30个字)