简单二叉树的基本功能(一)

本文介绍了二叉树(结构较简单的那种,没考虑很多因素进去)的基本实现功能:

1.二叉树的插入

2.二叉树的查询

3.二叉树的前序遍历、中序遍历、后序遍历

这里我首先建立了一个节点类:

//节点类
public class Node {
	//数据项
	public int data;
	public String sdata;
	
	//左孩子
	public Node leftChild;
	//右孩子
	public Node rightChild;
	
	
	public Node(int data,String sdata) {
		this.data = data;
		this.sdata = sdata;
	}
}

二叉树的基本功能实现:

//二叉树类
public class Tree {

	//根节点
	public Node root;
	
	/**
	 * 插入节点
	 * @param data	要插入节点中的int数据项
	 * @param sdata	要插入节点中的String数据项
	 */
	public void insert(int data, String sdata) {
		//创建一个新节点
		Node newNode = new Node(data,sdata);
		//若newNode是第一个节点,则将它作为根节点
		if(this.root == null) {
			this.root = newNode;
			return;
		}
		
		Node parent = this.root;	//表示要插入的位置的父节点,初始将其引用root
		Node child;		//表示要插入的位置
		
		//无限循环直到插入了节点
		while(true) {
			boolean leftFlag = false;	//表示要插入的节点是否在父节点的左子树
			boolean rightFlag = false;	//表示要插入的节点是否在父节点的右子树
			
			//若newNode中的data比根节点的data小,则放在父节点左子树
			if(parent.data>data) {
				child = parent.leftChild;
				leftFlag = true;	
			} else {
			//若newNode中的data比根节点的data大或相等,则放在父节点右子树	
				child = parent.rightChild;
				rightFlag = true;	
			}
			//child == null表示找到要插入的位置
			if(child == null && leftFlag) {
				//若插入位置是父节点的左孩子
				parent.leftChild = newNode;
				return;
			} else if(child == null && rightFlag) {
				//若插入位置是父节点的右孩子
				parent.rightChild = newNode;
				return;
			}
			//要是还未插入成功,则把子节点重新当成父节点,再次循环查找
			parent = child;	
		}
	}
	
	/**
	 *		查找节点
	 * @param data	需查找节点的int数据项
	 */
	public void find(int data) {
		if(this.root.data == data) {
			System.out.println(this.root.data + ", " + this.root.sdata);
			return;
		}
		
		Node parent = this.root;
		Node child;	
		//一直循环查找,直到父节点为null
		while(parent != null) {
			//若父节点的数据项为需要找的数据项
			if(parent.data == data) {
				System.out.println(parent.data + ", " + parent.sdata);
				return;
			}
			//若父节点的数据项大于要找的数据项,则查找其左子树;反之查找其右子树
			if(parent.data>data) {
				child = parent.leftChild;
			} else {
				child = parent.rightChild;
			}
			parent = child;	//父节点指向child节点再次循环查找
		}
		System.out.println("对不起,找不到该数据!");
	}
	
	/**
	 * 前序遍历二叉树
	 */
	public void beforeOrder(Node node) {
		if(node == null) 
			return;
		
		// 先访问根节点
		System.out.println(node.data + ", " + node.sdata);
		// 再访问左子树
		beforeOrder(node.leftChild);
		//最后访问右子树
		beforeOrder(node.rightChild);
	}
	
	/**
	 * 中序遍历二叉树
	 * 其中中序遍历普遍用的最多,因为中序遍历可以用来做排序
	 */
	public void inOrder(Node node) {
		if(node == null)
			return;
		
		//先访问左子树
		inOrder(node.leftChild);
		//再访问根节点
		System.out.println(node.data + ", " + node.sdata);
		//最后访问右子树
		inOrder(node.rightChild);
	}
	
	/**
	 * 后序遍历
	 */
	public void afterOrder(Node node) {
		if(node == null)
			return;
		
		//先访问左子树
		afterOrder(node.leftChild);
		//右访问右子树
		afterOrder(node.rightChild);
		//最后访问根节点
		System.out.println(node.data + ", " + node.sdata);
	}
}


后续还会有二叉树的其他基本功能,请见 简单二叉树的基本功能(二)。

猜你喜欢

转载自blog.csdn.net/hjl_heart/article/details/80146640
今日推荐