中序線索二叉樹的java版本__線索二叉樹

來源:互聯網
上載者:User
package threadbinarytree;


public class ThreadNode<T> {

private ThreadNode<T> leftNode;
private ThreadNode<T> rightNode;
private int lflag;
private int rflag;
private T data;
public ThreadNode(ThreadNode<T> leftNode, ThreadNode<T> rightNode,
int lflag, int rflag) {
this.leftNode = leftNode;
this.rightNode = rightNode;
this.lflag = lflag;
this.rflag = rflag;
}
public ThreadNode() {
this.leftNode=null;
this.rightNode=null;
this.lflag=0;
this.rflag=0;
}
public ThreadNode(T data) {
this();
this.data = data;
}
@Override
public int hashCode() {
return data.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ThreadNode other = (ThreadNode) obj;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
return true;
}
public ThreadNode<T> getLeftNode() {
return leftNode;
}
public void setLeftNode(ThreadNode<T> leftNode) {
this.leftNode = leftNode;
}
public ThreadNode<T> getRightNode() {
return rightNode;
}
public void setRightNode(ThreadNode<T> rightNode) {
this.rightNode = rightNode;
}
public int getLflag() {
return lflag;
}
public void setLflag(int lflag) {
this.lflag = lflag;
}
public int getRflag() {
return rflag;
}
public void setRflag(int rflag) {
this.rflag = rflag;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}

}


package threadbinarytree;


import java.util.Scanner;


public class ThreadTree<T> {


protected ThreadNode<T> head=null;
public static final String ENDFLAG="#";


public ThreadTree() {
}


public ThreadTree(ThreadNode<T> head) {
this.head = head;
}

//初始化根節點
public void initThreadTree(){
String item=null;
Scanner sc=new Scanner(System.in);
System.out.println("請輸入根節點");
item=sc.nextLine();
if(!item.equalsIgnoreCase(ENDFLAG)){
head=new ThreadNode(item);
init(head);
}
}
//初始化二叉樹
private void init(ThreadNode<T> head){
String item=null;
Scanner sc=new Scanner(System.in);
System.out.println("請輸入"+head.getData()+"的左孩子節點");
item=sc.nextLine();
if(!item.equalsIgnoreCase(ENDFLAG)){
head.setLeftNode(new ThreadNode(item));
init(head.getLeftNode());
}
System.out.println("請輸入"+head.getData()+"的右孩子節點");
item=sc.nextLine();
if(!item.equalsIgnoreCase(ENDFLAG)){
head.setRightNode(new ThreadNode(item));
init(head.getRightNode());
}
}

//建立線索二叉樹
public void createThreadTree(){

}

//中序遍曆
public void inTraverse(){

}


// //先序遍曆
// public void PreOrder(){
// PreOrder(head);
// }
// private void PreOrder(ThreadNode<T> head){
// if(head!=null){
// System.out.print(head.getData()+" ");
// PreOrder(head.getLeftNode());
// PreOrder(head.getRightNode());
// }
// }


}


package threadbinarytree;


//中序線索二叉樹類
public class InThreadTree<T>  extends ThreadTree<T>{


//全域的前驅
private ThreadNode<T> pre=null;

public InThreadTree(){
super();
}


@Override
public void initThreadTree() {
super.initThreadTree();
}




//建立線索二叉樹
@Override
public void createThreadTree() {
inThread(head);
}

//將二叉樹進行線索化
public void inThread(ThreadNode<T> root){
if(root != null){
inThread(root.getLeftNode()) ;//線索化左孩子
if(null == root.getLeftNode()&&(0==root.getLflag())){//左孩子為空白
root.setLflag(1) ;//將左孩子設定為線索
root.setLeftNode(pre) ;
}
if(pre!=null&&null == pre.getRightNode()){//右孩子為空白
pre.setRflag(1);
pre.setRightNode(root) ;
}
pre = root ;
inThread(root.getRightNode()) ;//線索化右孩子
}
}


/**
* 中序遍曆線索二叉樹
* @param root
*/
   @Override
public void inTraverse(){
   ThreadNode<T> root=this.head;
if(root != null){
while(root!=null && (root.getLflag()==0)){//如果左孩子不是線索
root = root.getLeftNode() ;//
}


do{
System.out.print(root.getData() + ",");
if(root.getRflag()==1){//如果右孩子是線索
root = root.getRightNode();
}else{//有右孩子
root = root.getRightNode() ;
while(root!=null && (root.getLflag()==0)){
root = root.getLeftNode() ;
}
}
}while(root != null) ; 
}
}

public static void main(String[] args) {
ThreadTree<String> tree=new InThreadTree<String>();
tree.initThreadTree();
tree.createThreadTree();
tree.inTraverse();
}

}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.