二叉查找树(特殊类型的二叉树)

二叉树

二叉树是一棵树,其中每个节点都不能有多于两个的儿子。如下图显示一颗由一个根和两颗子树组成的二叉树,左子树和右子树均可能为空。在这里插入图片描述

二叉树的实现

因为一个二叉树节点最多有两个子节点,所以我们可以保存直接链接到它们的链。树节点的声明在结构上类似于双链表的声明,在声明中,节点就是由element(元素)的信息加上两个到其他节点的引用(left和right)组成的结构。具体实现的代码如下:

private class Node{
		private int element;//存放数据
		private Node left;//左节点
		private Node right;//右节点
		}

二叉树的遍历

二叉树的遍历是一个很常见的问题。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。下面我们主要研究下先序、中序、后序遍历,这三种遍历方式其实指的是父节点被访问的次序。

  • 先序遍历(preOrder):若在遍历过程中,父节点先于它的子节点被访问,就是先序遍历。
public void preOrder(){
			System.out.print(this.data+"->");
			if(this.left!=null){
				this.left.preOrder();
			}
			if(this.right!=null){
				this.right.preOrder();
			}
		}
  • 中序遍历(inOrder):在遍历时,父节点被访问的次序位于左右孩子节点之间,就是中序遍历。
public void inOrder(){
			if(this.left!=null){
				this.left.inOrder();
			}
			System.out.print(this.data+"->");
			if(this.right!=null){
				this.right.inOrder();
			}
		}
  • 后序遍历(postOrder):在遍历时,访问完左右孩子节点之后再访问父节点,就是后序遍历。
public void postOrder(){
			if(this.left!=null){
				this.left.postOrder();
			}
			if(this.right!=null){
				this.right.postOrder();
			}
			System.out.print(this.data+"->");
		}

二叉查找树

  • 二叉查找树的定义
    二叉查找树是一种特殊的二叉树,它在二叉树的基础上增加了一个特点,就是每个节点比它左子树的节点值都要大,而比右子树的节点值都要小,因此它也被称为二叉排序树。

  • 二叉查找树的性质
    (1)若它的左子树非空,则左子树上所有节点的值均小于根节点的值;
    (2)若它的右子树非空,则右子树上所有节点的值均大于根节点的值;
    (3)左右子树本身又各是一颗二叉查找树;
    (4)按中序遍历二叉查找树,所得到的的中序遍历序列是一个递增有序序列。

  • 二叉查找树的实现

package 数据结构;

public class BinaryTree {
	private Node root;//根节点
	//内部类 节点
	private class Node{
		private int data;//存放数据
		private Node left;//左节点
		private Node right;//右节点
		public Node(int data){
			this.data=data;
		}
		//增加新节点
		public void addNode(int data){
			//数据小于根节点 放在左边
			if(data<=this.data){
				//判断左节点是否为空 为空新增 不为空递归
				if(this.left==null){
					this.left=new Node(data);
				}else{
					this.left.addNode(data);
				}
			}else{
				//数据大于根节点 放在右边
				if(data>this.data){
					if(this.right==null){
						this.right=new Node(data);
					}else{
						this.right.addNode(data);
					}
				}
			}
		}
		//先序遍历
		public void preOrder(){
			System.out.print(this.data+"->");
			if(this.left!=null){
				this.left.preOrder();
			}
			if(this.right!=null){
				this.right.preOrder();
			}
		}
		//中序遍历
		public void inOrder(){
			if(this.left!=null){
				this.left.inOrder();
			}
			System.out.print(this.data+"->");
			if(this.right!=null){
				this.right.inOrder();
			}
		}
		//后序遍历
		public void postOrder(){
			if(this.left!=null){
				this.left.postOrder();
			}
			if(this.right!=null){
				this.right.postOrder();
			}
			System.out.print(this.data+"->");
		}
		//二叉查找树最小值的递归实现
		private Node findMin(Node t){
			if(t==null){
				return null;
			}else if(t.left==null){
				return t;
			}
			return findMin(t.left);
		}
		//二叉查找树最大值的非递归实现
		private Node findMax(Node t){
			if(t!=null){
				while(t.right!=null){
					t=t.right;
				}
			}
			return t;
		}
	}
	//判断是否增加新节点
			public void add(int data){
				if(root==null){
					root=new Node(data);
				}else{
					root.addNode(data);
				}
			}
			public void print(){
				root.preOrder();
				System.out.println();
				root.inOrder();
				System.out.println();
				root.postOrder();
			}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值