/*
* 引線二元數
*
*/
public class Threaf_Binary_Tree {
Thread_Node rootNode ;
Threaf_Binary_Tree(int[] data){
for(int i : data )
add_Node_To_Tree(i );
}
public static void main(String[] args) {
int[] data = {0,101,118,87,12,765,65};
Threaf_Binary_Tree b = new Threaf_Binary_Tree(data);
b.inOrder(b.rootNode);
}
private void add_Node_To_Tree(int value) {
Thread_Node currNode = null ; //目前
Thread_Node newNode = new Thread_Node(value); //現在加入
Thread_Node previous = null ; // 之前的
Thread_Node parent ;//父節點
int pos ; // -1 1
//建立根結點
if(rootNode == null){
rootNode = newNode ;
rootNode.LBIT = 0;//左虛線
rootNode.LEFT_Node = rootNode ;
rootNode.RIGHT_Node = null ;
rootNode.RBIT = 1 ;
return ;
}
//起始位置
currNode = rootNode.RIGHT_Node ;
if(currNode == null){
rootNode.RIGHT_Node = newNode ;
newNode.LEFT_Node = rootNode ;
newNode.RIGHT_Node = rootNode ;
return ;
}
parent = rootNode ;//父從根開始
pos = 0;
while(currNode != null){//決定Node位置
if(value > currNode.data){//大於 右子樹
if(pos != 1){
pos = 1 ;
previous = parent ;//如果另外一個方向 currNode的父 變成 previous
}
parent = currNode ;
if(currNode.RBIT == 1)
currNode = currNode.RIGHT_Node ;
else
currNode = null ;
}else if(value < currNode.data){
if(pos != -1){
pos = -1 ;
previous = parent ;
}
parent = currNode ;
if(currNode.LBIT== 1)//假如 左邊為正常指標就繼續找
currNode = currNode.LEFT_Node ;
else //反之停止
currNode = null ;
}
}
if(value > parent.data){ //找到父節點後 尋肘是否大於 小於的位置
parent.RBIT = 1 ;
parent.RIGHT_Node = newNode ;
newNode.RIGHT_Node = previous ;
newNode.LEFT_Node = parent;
}else{
parent.LBIT = 1 ;
parent.LEFT_Node = newNode ;
newNode.RIGHT_Node = parent ;
newNode.LEFT_Node = previous;
}
}
public void inOrder(Thread_Node node){//Thread Tree inOrder
do{
if(node.RBIT == 0){//假如等於引線
node = node.RIGHT_Node ;
}else{
node = node.RIGHT_Node ;
while(node.LBIT != 0)
node = node.LEFT_Node ;
}
if(node != rootNode)
System.out.print(node.data+" ");
}while(node != rootNode);
}
}
class Thread_Node{
public Thread_Node(int value) {
data = value ;
}
int data ;
int LBIT = 0 ;
Thread_Node LEFT_Node ; //左鏈結
int RBIT = 0;
Thread_Node RIGHT_Node ;
}
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。