最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

检索二叉树中序遍历算法详解

XAMPP案例 admin 589浏览 0评论
package tree;

/*
 * 線索二叉樹
 */
public class ThreadBinaryTree<E> {
	private E[] elements = null;
	private int count = 0;
	private Node pre;//中序遍歷最後一個結點或中序遍歷前一個結點變數
	private Node lastLeft;//中序遍歷第一個結點

	/*前序遞迴生成二叉樹*/
	public Node createBinaryTree(){
		Node node = new Node();

		if(count >= elements.length || elements[count++] == "#"){
			return null;
		}else{
			node.element = elements[count - 1];
			node.left = createBinaryTree();
			node.right = createBinaryTree();
		}

		return node;
	}

	//中序遍歷生成線索二叉樹
	public Node inThreading(Node current){
		if(current != null){
			inThreading(current.left);//遞迴左子樹線索化
			if(current.left == null){ //當前結點沒有左孩子
				current.lefeTag = 1;
				current.left = pre;
			}

			if(pre.right == null){ //前驅沒有右孩子
				pre.rightTag = 1;
				pre.right = current;
			}

			pre = current;//指向前一個結點
			inThreading(current.right);//遞迴右子樹線索化
		}
		return null;
	}

	/*帶頭結點的線索二叉樹*/
	public void inHeadThreading(Node head,Node root){
		if(head == null){
			head = new Node();
		}

		if(root == null){
			return;
		}else{
			head.left = root;//頭結點的左孩子指向根結點
			head.lefeTag = 0;
			//使二叉樹中序序列中的第一個結點的left和最後一個結點的right指向頭結點
			//找到第一個結點
			findLastLeftNode(root);
			lastLeft.lefeTag = 1;
			lastLeft.left = head;

			inThreading(root);//找到最後一個結點
			head.right = pre;//頭結點右孩子為空,則指向最後一個結點
			head.rightTag = 1;
			pre.right = head;//使得最後一個結點的右孩子指向頭結點
			pre.rightTag = 1;

		}
	}

	/*線索二叉樹的遍歷*/
	public void inOrderTreverse(Node head){
		Node current = head.left;
		while(current != head){
			while(current.lefeTag == 0){
				current = current.left;
			}
			System.out.println(current.element);

			while(current.rightTag == 1 && current.right != head){
				current = current.right;
				System.out.println(current.element);
			}

			current = current.right;
		}
	}

	/*找到最左邊的結點,即中序遍歷的第一個結點*/
	public void findLastLeftNode(Node root){
		if(root == null){
			return;
		}

		Node current = root;
		while(current.left != null){
			current = current.left;
		}

		lastLeft = current;
	}

	static class Node<E>{
		int lefeTag; /*如果Tag為0則標識指向左右孩子的指標,如果為1則標識指向前驅或後繼的線索*/
		int rightTag;
		Node<E> left;
		Node<E> right;
		E element;

		public Node(){
		}

		public Node(E element){
			this.element = element;
		}
	}
}

转载请注明:XAMPP中文组官网 » 检索二叉树中序遍历算法详解

您必须 登录 才能发表评论!