二叉樹的實現&&遞歸和非遞歸方式前序、中序、後續遍歷&&發現一個節點中序遍歷的下一節點



import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

public class FindNextNode {
 private int [] a ={1,2,3,4,5,6,7,8,9};
 private static List<Node> nodeList=null;
 
 //內部類 節點
 private static class Node{
  Node leftNode;
  Node rightNode;
  Node parentNode;
  int data;
  Node(int data){
   this.data=data;
   leftNode=null;
   rightNode=null;
   parentNode=null;
  }
 }
 
 public void creatBinTree(){
  nodeList =new LinkedList<Node>();
  for(int i=0;i<a.length;i++){
   nodeList.add(new Node(a[i]));
  }
  
  for(int i=0;i<(a.length-1)/2;i++){
   nodeList.get(i).leftNode=nodeList.get(i*2+1);
   nodeList.get(i).rightNode=nodeList.get(i*2+2);     
  }
  for(int i=a.length-1;i>0;i--){
   nodeList.get(i).parentNode=nodeList.get((i-1)/2);
  }
  nodeList.get(0).parentNode=null;
 }
 /**
  * 遞歸方式前,中,後序遍歷
  * @param node
  */
 public static void preOrderTraverse(Node node) { 
         if (node == null) 
           return; 
     System.out.print(node.data + " "); 
        preOrderTraverse(node.leftNode); 
        preOrderTraverse(node.rightNode); 
    } 
 public static void inOrderTraverse(Node node){
  if(node==null){
   return;
  }
  inOrderTraverse(node.leftNode);
  System.out.print(node.data+" ");
  inOrderTraverse(node.rightNode);
 }
 public static void latOrderTraverse(Node node){
  if(node==null){
   return;
  }
  latOrderTraverse(node.leftNode);
  latOrderTraverse(node.rightNode);
  System.out.print(node.data+" ");
 }
 /**
  * 非遞歸方式前,中,後序遍歷
  * @param node
  * @return
  */
 public static void preOrder2(Node node){
  Stack<Node> s=new Stack<Node>();
  while(node!=null || !s.isEmpty()){
   while(node!=null){
    System.out.print(node.data+" ");
    s.push(node);
    node=node.leftNode;
   }
   if(!s.isEmpty()){
    node=s.pop();
    node=node.rightNode;
   }
  }
 }
 public static void inOrder2(Node node){
  Stack<Node> s=new Stack<Node>();
  while(node!=null || !s.isEmpty()){
   while(node!=null){
    s.push(node);
    node=node.leftNode;    
   }
   if(!s.isEmpty()){
    node=s.pop();
    System.out.print(node.data+" ");    
    node=node.rightNode;
   }
  }
 }
 public static void postOrder2(Node node){
  Stack<Node> s=new Stack<Node>();
  Stack<Integer> s2=new Stack<Integer>();
  Integer i=new Integer(1);
  while(node!=null || !s.isEmpty()){
   while(node!=null){
    s.push(node);
    s2.push(new Integer(0));
    node=node.leftNode;
   }
   while(!s.isEmpty()&&s2.peek().equals(i)){
    s2.pop();
    System.out.print(s.pop().data+" ");
   }
   if(!s.isEmpty()){
    s2.pop();
    s2.push(new Integer(1));
    node=s.peek();
    node=node.rightNode;
   }
  }
 }
 
 //發現中序遍歷的下一個節點
 public static Node getnextnodeininorder(Node node){
  if(node==null){
   return null;
  }
  if(node.rightNode!=null){
   node=node.rightNode;
   while(node.leftNode!=null){
    node=node.leftNode;
   }
   return node;
  }else if(node.parentNode!=null){
   Node node1=node.parentNode;  
   if(node==node1.leftNode){
    return node1;
   }else{
    while(node1!=null&&node==node1.rightNode){
     node=node1; 
     node1=node1.parentNode;
    }
    return node1; 
   }
     
  }
  return null;
  
 }
 
 public static void main(String []args){ 
  FindNextNode bintree=new FindNextNode();
  bintree.creatBinTree();
  Node rootNode=nodeList.get(0);
  System.out.println("前序遍歷1");
  preOrderTraverse(rootNode);
  System.out.println();
  System.out.println("前序遍歷2");
  preOrder2(rootNode);
  System.out.println();
  System.out.println("中序遍歷1");
  inOrderTraverse(rootNode);
  System.out.println();
  System.out.println("中序遍歷2");
  inOrder2(rootNode);
  System.out.println();
  System.out.println("後序遍歷1");
  latOrderTraverse(rootNode);
  System.out.println();
  System.out.println("後序遍歷2");
  postOrder2(rootNode);
  System.out.println();
  System.out.println("---------------");
  System.out.println("中序遍歷得到下一個節點");
  for(int i=0;i<nodeList.size();i++){
   Node n1=nodeList.get(i);
   if(n1!=null&&getnextnodeininorder(n1)!=null){
    System.out.println(n1.data+" "+getnextnodeininorder(n1).data);
   }else if(getnextnodeininorder(n1)==null){
    System.out.println(n1.data+" "+"null");
   }  
  }    
  System.out.println("---------------");  
 } 
 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章