zoukankan      html  css  js  c++  java
  • Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作

    1、首先,须要一个节点对象的类。这些对象包括数据。数据代表存储的内容,并且还有指向节点的两个子节点的引用

    class Node {
    	public int iData;
    	public double dData;
    	public Node leftChild;
    	public Node rightChild;
    	public void displayNode() {
    		System.out.print("{");
    		System.out.print(iData);
    		System.out.print(",");
    		System.out.print(dData);
    		System.out.print("}");
    	}
    }

    2、插入一个节点

    从根開始查找一个对应的节点,它将是新节点的父节点。

    当父节点找到了,新节点就能够连接到它的左子节点或右子节点处。这取决于新节点的值是比父节点的值大还是小。

    以下是insert()方法代码:

    public void insert(int id, double dd) {
    		Node newNode = new Node();
    		newNode.iData = id;
    		newNode.dData = dd;
    		if(root == null)
    			root = newNode;
    		else {
    			Node current = root;
    			Node parent;
    			while(true) {
    				parent = current;
    				if(id < current.iData) {
    					current = current.leftChild;
    					if(current == null) {
    						parent.leftChild = newNode;
    						return;
    					}
    				} else {
    					current = current.rightChild;
    					if(current == null) {
    						parent.rightChild = newNode;
    						return;
    					}
    				}
    			} // end while
    		} // end else
    	}

    这里用一个新的变量parent(current的父节点),来存储遇到的最后一个不是null的节点。必须这样做,由于current在查找的过程中会变成null,才干发现它查过的上一个节点没有一个相应的子节点。

    假设不存储parent。就会失去插入新节点的位置。


    3、查找一个节点

    public Node find(int key) {
    		// 如果树非空
    		Node current = root;
    		while(current.iData != key) {
    			if(key < current.iData)
    				current = current.leftChild;
    			else
    				current = current.rightChild;
    			if(current == null)
    				return null;
    		}
    		return current;
    	}

    找到节点:假设while循环不满足条件,从循环的末端退出来。current的iData字段和key相等,这就找到了该节点。

    找不到节点:假设current等于null。在查找序列中找不到下一个子节点,到达序列的末端而没有找到要找的节点。表明了它不存在。返回nulll来指出这个情况。


    4、遍历树(前序遍历。中序遍历,后序遍历)

    /**
    	 * 前序遍历
    	 * @param localRoot
    	 */
    	public void preOrder(Node localRoot) {
    		if(localRoot != null) {
    			System.out.print(localRoot.iData+" ");
    			preOrder(localRoot.leftChild);
    			preOrder(localRoot.rightChild);
    		}
    	}
    	
    	/**
    	 * 中序遍历
    	 * @param localRoot
    	 */
    	public void inOrder(Node localRoot) {
    		if(localRoot != null) {
    			preOrder(localRoot.leftChild);
    			System.out.print(localRoot.iData+" ");
    			preOrder(localRoot.rightChild);
    		}
    	}
    	
    	/**
    	 * 后序遍历
    	 * @param localRoot
    	 */
    	public void postOrder(Node localRoot) {
    		if(localRoot != null) {
    			preOrder(localRoot.leftChild);
    			preOrder(localRoot.rightChild);
    			System.out.print(localRoot.iData+" ");
    		}
    	}

    遍历树的最简单方法使用递归的方法。

    用递归的方法遍历整棵树要用一个节点作为參数。初始化这个节点是根。比如中序遍历仅仅须要做三件事:

    1)、调用自身来遍历节点的左子树

    2)、訪问这个节点

    3)、调用自身来遍历节点的右子树。


    5、查找最大值和最小值

    /**
    	 * 求树中的最小值
    	 * @return
    	 */
    	public Node minimum() {
    		Node current;
    		current = root;
    		Node last = null;
    		while(current != null) {
    			last = current;
    			current = current.leftChild;
    		}
    		return last;
    	}
    	
    	/**
    	 * 求树中的最大值
    	 * @return
    	 */
    	public Node maxmum() {
    		Node current;
    		current = root;
    		Node last = null;
    		while(current != null) {
    			last = current;
    			current = current.rightChild;
    		}
    		return last;
    	}


    下面是完整測试代码:

    package binTree;
    
    class Node {
    	public int iData;
    	public double dData;
    	public Node leftChild;
    	public Node rightChild;
    	public void displayNode() {
    		System.out.print("{");
    		System.out.print(iData);
    		System.out.print(",");
    		System.out.print(dData);
    		System.out.print("}");
    	}
    }
    
    class Tree {
    	private Node root;
    	public Tree() {
    		root = null;
    	}
    	/**
    	 * 查找节点
    	 * @param key
    	 * @return
    	 */
    	public Node find(int key) {
    		// 如果树非空
    		Node current = root;
    		while(current.iData != key) {
    			if(key < current.iData)
    				current = current.leftChild;
    			else
    				current = current.rightChild;
    			if(current == null)
    				return null;
    		}
    		return current;
    	}
    	/**
    	 * 插入节点
    	 * @param id
    	 * @param dd
    	 */
    	public void insert(int id, double dd) {
    		Node newNode = new Node();
    		newNode.iData = id;
    		newNode.dData = dd;
    		if(root == null)
    			root = newNode;
    		else {
    			Node current = root;
    			Node parent;
    			while(true) {
    				parent = current;
    				if(id < current.iData) {
    					current = current.leftChild;
    					if(current == null) {
    						parent.leftChild = newNode;
    						return;
    					}
    				} else {
    					current = current.rightChild;
    					if(current == null) {
    						parent.rightChild = newNode;
    						return;
    					}
    				}
    			} // end while
    		} // end else
    	}
    	/**
    	 * 前序遍历
    	 * @param localRoot
    	 */
    	public void preOrder(Node localRoot) {
    		if(localRoot != null) {
    			System.out.print(localRoot.iData+" ");
    			preOrder(localRoot.leftChild);
    			preOrder(localRoot.rightChild);
    		}
    	}
    	
    	/**
    	 * 中序遍历
    	 * @param localRoot
    	 */
    	public void inOrder(Node localRoot) {
    		if(localRoot != null) {
    			preOrder(localRoot.leftChild);
    			System.out.print(localRoot.iData+" ");
    			preOrder(localRoot.rightChild);
    		}
    	}
    	
    	/**
    	 * 后序遍历
    	 * @param localRoot
    	 */
    	public void postOrder(Node localRoot) {
    		if(localRoot != null) {
    			preOrder(localRoot.leftChild);
    			preOrder(localRoot.rightChild);
    			System.out.print(localRoot.iData+" ");
    		}
    	}
    	
    	/**
    	 * 求树中的最小值
    	 * @return
    	 */
    	public Node minimum() {
    		Node current;
    		current = root;
    		Node last = null;
    		while(current != null) {
    			last = current;
    			current = current.leftChild;
    		}
    		return last;
    	}
    	
    	/**
    	 * 求树中的最大值
    	 * @return
    	 */
    	public Node maxmum() {
    		Node current;
    		current = root;
    		Node last = null;
    		while(current != null) {
    			last = current;
    			current = current.rightChild;
    		}
    		return last;
    	}
    }
    
    public class TreeApp {
    	public static void main(String[] args) {
    		Tree theTree = new Tree();
    		/**
    		 *                50
    		 *               /  
    		 *              25  75
    		 *             /     
    		 *            12 37   87
    		 *               /     
    		 *              30 43   93
    		 *                       
    		 *                33      97
    		 */
    		theTree.insert(50, 1.5);
    		theTree.insert(25, 1.2);
    		theTree.insert(75, 1.7);
    		theTree.insert(12, 1.5);
    		theTree.insert(37, 1.2);
    		theTree.insert(43, 1.7);
    		theTree.insert(30, 1.5);
    		theTree.insert(33, 1.2);
    		theTree.insert(87, 1.7);
    		theTree.insert(93, 1.5);
    		theTree.insert(97, 1.5);
    		System.out.println("插入完成~");
    		
    		//找到root节点
    		Node nodeRoot = theTree.find(50);
    		// 中序遍历
    		theTree.inOrder(nodeRoot);
    		System.out.println();
    		// 求最小值
    		System.out.println("mini:"+ theTree.minimum().iData);
    		// 求最大值
    		System.out.println("max:"+ theTree.maxmum().iData);
    		
    	}
    }
    


  • 相关阅读:
    SIFT,SURF,ORB,FAST,BRISK 特征提取算法比较
    OpenCV 4.2.0 编译成功日志(Mac)
    Ceres Solver Bibliography
    Linux下重启就需要重新激活eth0的解决办法(ifup eth0)
    PS(光影魔术手)
    软件项目开发各阶段文档模板(参考)
    敏捷、瀑布开发模式
    QA
    QC
    会计人必知的实务基础知识
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7120157.html
Copyright © 2011-2022 走看看