数据结构之二叉查找树

二叉查找树由节点构成,每个结构包含数值元素,左子树(指向左边相连的节点的指针),右子树(指向右边相连的节点的指针),父节点(指向父节点的指针)


public class BinaryNode {

	private int data;
	private BinaryNode left=null;
	private BinaryNode right=null;
	private BinaryNode parent=null;
	
	public BinaryNode getParent() {
		return parent;
	}
	
	public void setParent(BinaryNode parent) {
		this.parent = parent;
	}
	
	public BinaryNode(int data){
		this.data=data;
	}
	
	public BinaryNode(){
		
	}
	
	public int getData() {
		return data;
	}
	public void setData(int data) {
		this.data = data;
	}
	public BinaryNode getLeft() {
		return left;
	}
	public void setLeft(BinaryNode left) {
		this.left = left;
	}
	public BinaryNode getRight() {
		return right;
	}
	public void setRight(BinaryNode right) {
		this.right = right;
	}
	
	
}

二叉查找树的特点是每个节点的值都大于它左子树的数值,而小于它又子树的数值,不能有重复元素。第一个添加的元素即为根节点。

//构造二叉查找树
public class BinaryTree {
	
	private BinaryNode root;

	public BinaryTree(int num) {
		root = new BinaryNode(num);
	}

/*
添加节点,如果是第一次添加,则该节点为root节点,所有节点中只有root节点的父节点为null
添加的方法是进行递归比较,比当前节点值小的往左子树上靠,比当前节点值大的往右子树上靠,
如果正好和本节点值相等,则舍弃(因为二叉查找树不能有重复元素)
*/

	public void insert(int num) {
		BinaryNode node = root;
		while (node != null) {
			if (num == node.getData()) {
				return;
			} else if (num < node.getData()) {
				if (node.getLeft() == null) {
					BinaryNode new_node = new BinaryNode(num);
					node.setLeft(new_node);
					new_node.setParent(node);
					return;
				} else {
					node = node.getLeft();
					continue;
				}
			} else {
				if (node.getRight() == null) {
					BinaryNode new_node = new BinaryNode(num);
					node.setRight(new_node);
					new_node.setParent(node);
					return;
				} else {
					node = node.getRight();
					continue;
				}
			}
		}
	}

//删除节点的入口,递归调用重载的delete函数
	public void delete(int num) {
		delete(num, root);
	}

/*
  删除策略:1.如果是空树,返回;
            2.如果要删除的数值小于当前节点的数值,在左节点上递归删除,如果要删除的数值大于当前节点的数值,在右节点上递归删除;
			3.如果要删除的数值等于当前节点的数值,分下列情形分别处理:
			    a.当前节点既有左子树又有右子树,那么找到右子树中最小的那个节点(即右子树上最左的那个节点,即为RightMin节点),
				  将当前节点的数值设置为RightMin节点的数值,然后重新调用delete函数删除RightMin节点;
				b.如果只有左子树,则删掉该节点,直接用左子树代替之。注意要重新设置parent,如果删除了root节点,需要重新指定root;
                c.如果只有右子树,则删掉该节点,直接用右子树代替之。注意要重新设置parent,如果删除了root节点,需要重新指定root;
				d.如果既没有左子树也没有右子树,直接删除之;
*/ 

	private void delete(int num, BinaryNode node) {

		if (node == null)
			return;

		if (num > node.getData()) {
			delete(num, node.getRight());
		} else if (num < node.getData()) {
			delete(num, node.getLeft());
		} else {

			if (node.getLeft() != null && node.getRight() != null) {

				int min = findMin(node.getRight());
				delete(min, node.getRight());
				node.setData(min);
			} else {
				BinaryNode tt = (node.getLeft() != null) ? node.getLeft()
						: node.getRight();
				BinaryNode p = node.getParent();
				if (p == null) {
					root = tt;
					if (root != null)
						root.setParent(null);
				} else {
					if (p.getData() > node.getData())
						p.setLeft(tt);
					else
						p.setRight(tt);
					if(tt!=null)
						tt.setParent(p);
				}
			}

		}
	}


   //查找最小节点的入口
	public int findMin() {
		return findMin(root);
	}

    //递归查找,知道找到最左的那个节点
	private int findMin(BinaryNode node) {
		BinaryNode new_node = node;
		while (new_node.getLeft() != null)
			new_node = new_node.getLeft();
		return new_node.getData();
	}

	

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉查找树在查找中有重要的应用。它是一种满足以下两个条件的二叉树:对于树中的每个节点X,它的左子树中所有项的值都要小于X中的项;对于树中的每个节点Y,它的右子树中所有项的值都要大于Y中的项。这种特点使得二叉查找树在查找操作中非常高效。 一种常见的应用是在二叉排序树中实现中序遍历,可以通过中序遍历得到一个升序的数列。在给定的代码中,InOrder函数通过递归实现了二叉排序树的中序遍历。它将树的左子树进行中序遍历,然后将根节点的值存入数组,最后再对树的右子树进行中序遍历。isOrder函数则用于判断一个数列是否升序。它通过遍历数列中的每个元素,判断当前元素是否大于前一个元素来判断数列是否升序。 因此,二叉查找树的应用主要是用于高效的查找操作,并且可以通过中序遍历获取升序的数列。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++二叉查找树实现过程详解](https://download.csdn.net/download/weixin_38727980/13758023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数据结构-二叉查找树的应用](https://blog.csdn.net/Junds0/article/details/121791335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值