28、線索二叉樹

1、前序和中序線索二叉樹 思路就是構建個pre指針,在交換時,注意pre和curNode節點的指針指向問題

  • 代碼:
package tree;

import javax.xml.soap.Node;

public class ThreadBinaryTreeDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//1、**************演示前中後序打印結果***************
			// TODO Auto-generated method stub
			ThreadBinaryTreeNode binaryTreeNode1 = new ThreadBinaryTreeNode(1, "宋江");
			ThreadBinaryTreeNode binaryTreeNode2 = new ThreadBinaryTreeNode(2, "林沖");
			ThreadBinaryTreeNode binaryTreeNode3 = new ThreadBinaryTreeNode(3, "盧俊義");
			ThreadBinaryTreeNode binaryTreeNode4 = new ThreadBinaryTreeNode(4, "武大郎");
			ThreadBinaryTreeNode binaryTreeNode5 = new ThreadBinaryTreeNode(5, "智多星");
			ThreadBinaryTreeNode binaryTreeNode6 = new ThreadBinaryTreeNode(6, "及時雨");
			
			binaryTreeNode1.setLeftNode(binaryTreeNode2);
			binaryTreeNode1.setRightNode(binaryTreeNode4);
			binaryTreeNode2.setLeftNode(binaryTreeNode3);
			binaryTreeNode4.setLeftNode(binaryTreeNode5);
			binaryTreeNode4.setRightNode(binaryTreeNode6);
			
			ThreadBinaryTree binaryTree = new ThreadBinaryTree(binaryTreeNode1);//root
//			binaryTree.infixthread(binaryTreeNode1);
//			binaryTree.preThread(binaryTreeNode1);
			
//			binaryTree.infixOut();
//			binaryTree.preOut();
			
			
//			System.out.println(binaryTreeNode2.getRightNode());
			

	}
	
	
	

}


//構建線索二叉樹
class ThreadBinaryTree{
	private ThreadBinaryTreeNode root;
	private ThreadBinaryTreeNode pre = null;
	
	public ThreadBinaryTree(ThreadBinaryTreeNode root) {
		super();
		this.root = root;
	}
	
	
	//中序線索二叉樹
	public void infixthread(ThreadBinaryTreeNode node) {
		if(node == null) {
			return;
		}
		//左
		infixthread(node.getLeftNode());
		//
		if(node.getLeftNode() == null) {
			node.setLeftNode(pre);
			node.setLeftType(1);
		}
		if(pre != null && pre.getRightNode() == null) {
			pre.setRightNode(node);
			pre.setRightType(1);
		}
		pre = node;

		//右
		infixthread(node.getRightNode());
		

	}
	//中序遍歷線索二叉樹
	public void infixOut() {
		if(root == null) {
			return;
		}
		ThreadBinaryTreeNode temp = root;
		while(temp != null) {
			while(temp.getLeftType() == 0) {
				temp = temp.getLeftNode();
			}
			System.out.println(temp.toString());
			
			while(temp.getRightType() == 1) {
				temp = temp.getRightNode();
				System.out.println(temp.toString());
			}
			temp = temp.getRightNode();		
			
		}

	}
	
	
	//前序線索二叉樹
	public void preThread(ThreadBinaryTreeNode node) {
		if(node == null) {
			return;
		}
		//
		if(node.getLeftNode() == null) {
			node.setLeftNode(pre);
			node.setLeftType(1);
		}
		if(pre != null && pre.getRightNode() == null) {
			pre.setRightNode(node);
			pre.setRightType(1);
		}
		pre = node;
		
		if(node.getLeftType() == 0) {
			preThread(node.getLeftNode());
		}
		if(node.getRightType() == 0) {
			preThread(node.getRightNode());
		}
	}
	
	
	//前序遍歷線索二叉樹
	public void preOut() {
		if(root == null) {
			return;
		}
		ThreadBinaryTreeNode temp = root;
		while(temp != null) {
			System.out.println(temp.toString());
			
			while(temp.getLeftType() == 0) {
				temp = temp.getLeftNode();
				System.out.println(temp.toString());
			}
			temp = temp.getRightNode();		
			
		}
	}
	
	

	
	
	
}





//定義線索二叉樹的節點
class ThreadBinaryTreeNode{
	private int no;
	private String name;
	private ThreadBinaryTreeNode leftNode;//默認爲空
	private ThreadBinaryTreeNode rightNode;//默認爲空
	private int leftType;//左節點的類型,0:左子樹;1:左前驅
	private int rightType;//右節點的類型,0:右子樹;1:右後繼
	
	//構造函數
	public ThreadBinaryTreeNode(int no, String name) {
		super();
		this.no = no;
		this.name = name;
	}

	
	
	public int getLeftType() {
		return leftType;
	}



	public void setLeftType(int leftType) {
		this.leftType = leftType;
	}



	public int getRightType() {
		return rightType;
	}



	public void setRightType(int rightType) {
		this.rightType = rightType;
	}



	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public ThreadBinaryTreeNode getLeftNode() {
		return leftNode;
	}

	public void setLeftNode(ThreadBinaryTreeNode leftNode) {
		this.leftNode = leftNode;
	}

	public ThreadBinaryTreeNode getRightNode() {
		return rightNode;
	}

	public void setRightNode(ThreadBinaryTreeNode rightNode) {
		this.rightNode = rightNode;
	}

	@Override
	public String toString() {
		return "BinaryTreeNode [no=" + no + ", name=" + name + "]";
	}
	
	
	
	
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章