java二叉樹的建立,遍歷及其餘方法

package tree;

import java.util.Stack;

/**二叉樹**/
public class BinaryTree {
	
	public static void main(String[] args) {
		BinaryTree tree=new BinaryTree();
		tree.createBinaryTree();
		tree.RLN_Order(tree.root);
		
		tree.noneRecPostOrder(tree.root);
	}
	
	
	private TreeNode root=null;
	
	public BinaryTree(){
		root=new TreeNode(1,"rootNode(A)");
	}
	
	public  void createBinaryTree(){
		TreeNode newNodeB=new TreeNode(2,"B");
		TreeNode newNodeC=new TreeNode(3,"C");
		TreeNode newNodeD=new TreeNode(4,"D");
		TreeNode newNodeE=new TreeNode(5,"E");
		TreeNode newNodeF=new TreeNode(6,"F");
		TreeNode newNodeG=new TreeNode(7,"G");
		TreeNode newNodeH=new TreeNode(8,"H");
		TreeNode newNodeI=new TreeNode(9,"I");
		TreeNode newNodeJ=new TreeNode(10,"J");
		
		root.left=newNodeB;
		root.right=newNodeC;
		newNodeB.left=newNodeD;
		newNodeB.right=newNodeE;
		newNodeC.left=newNodeF;
		newNodeC.right=newNodeG;
		newNodeF.left=newNodeH;
		
		newNodeG.left=newNodeI;
		newNodeG.right=newNodeJ;
		
	}
	
	
	public boolean isEmpty(){
		return root==null;
	}
	
	
	public int height(){
		return height(root);
	}
	
	public int size(){
		return size(root);
	}
	
	
	/**
	 * 求樹的高度
	 *  int i=(node.left==null)?(0):(height(node.left));
	    int j=(node.right==null)?(0):(height(node.right));
	 * **/
	private int height(TreeNode node){
		if(node==null){
			return 0;
		}else{
			int i=(node.left==null)?(0):(height(node.left));
		    int j=(node.right==null)?(0):(height(node.right));
			return (i<j)?(j+1):(i+1);
		}
	}
	
	
	
	/**求樹的大小**/
    private int size(TreeNode node){
    	if(node==null){
    		return 0;
    	}else{
    		return 1+size(node.left)+size(node.right);
    	}
	}
    
    
    /**返回雙親節點**/
    public TreeNode parent(TreeNode element){
    	return (root==null || root==element)?(null):(parent(root,element));
    }
	
	private TreeNode parent(TreeNode subtree,TreeNode element){
		if(subtree==null){
			return null;
		}
		if(subtree.left==element || subtree.right==element ){
			return subtree;
		}
		TreeNode p=parent(subtree.left,element);
		if(p!=null){
			return p;
		}else{
			return parent(subtree.right,element);
		}
	}
	
	/**左子節點**/
	public TreeNode getLeftChildNode(TreeNode element){
		return (element!=null)?(element.left):(null);
	}
	
	/**右子節點**/
	public TreeNode getRightChildNode(TreeNode element){
		return (element!=null)?(element.right):(null);
	}
    
	
	/**經過某個節點摧毀這個節點及其下面的子節點**/
	public void destroy(TreeNode node){
		if(node !=null){
			destroy(node.left);/**刪除左邊的子節點**/
			destroy(node.right);/**刪除右邊的子節點**/
			node=null;/**刪除該節點**/
		}
	}
	
	/**根據某個節點遍歷該節點的屬性及其子節點**/
	public void traverse(TreeNode node){
		if(node !=null){
			System.out.println("key---->"+node.key+"    name---->"+node.date);
			traverse(node.left);
			traverse(node.right);
		}
	}
	
	
	/**node 表示根(N)     left  表示左(L)    right表示右邊(R)**/
	
	/**前根遍歷(遞歸)**/
	public void NLR_Order(TreeNode node){
		if(node !=null){
			visted(node);
			NLR_Order(node.left);
			NLR_Order(node.right);
		}
	}
	
	
	/**中根遍歷(遞歸)**/
	public void LNR_Order(TreeNode node){
		if(node !=null){
			LNR_Order(node.left);
			visted(node);
			LNR_Order(node.right);
		}
	}
	
	
	/**中根遍歷(遞歸)**/
	public void RLN_Order(TreeNode node){
		if(node !=null){
			RLN_Order(node.right);
			RLN_Order(node.left);
			visted(node);
		}
	}
	
	
	/** 前根 (前序) 遍歷的非遞歸實現   **/
    public void noneRecPreOrder(TreeNode node){  
    	  Stack<TreeNode> s = new Stack<TreeNode>();
    	  s.push(node);
    	  while(!s.isEmpty()) {
    		   TreeNode temp = (TreeNode)s.pop();
	    	   visted(temp);
	    	   if(temp.right != null) s.push(temp.right);
	    	   if(temp.left != null) s.push(temp.left);
    	  }
    }  
	
    /** 中跟遍歷的非遞歸實現   **/
    public void noneRecInOrder(TreeNode node){
    	Stack<TreeNode> stack=new Stack<TreeNode>();
    	TreeNode temp=node;
    	while(temp!=null || !stack.isEmpty()){
    		if(temp!=null){
    			stack.push(temp);
    			temp=temp.left;
    		}else{
    			temp=stack.pop();
    			visted(temp);
    			temp=temp.right;
    		}
    	}
    }
    
    /** 後跟遍歷的非遞歸實現   **/
    public void noneRecPostOrder(TreeNode p){  
        
    }
    
	
	
	/**顯示該節點的key 和 date**/
	public void visted(TreeNode node){
		node.isVisted=true;
		System.out.println("key------>"+node.key+"    name----->"+node.date);
	}
	
    
	@SuppressWarnings("unused")
	private class TreeNode{
		private int key;
		private String date;
		private TreeNode left=null;
		private TreeNode right=null;
		private boolean isVisted=false;
		public TreeNode(int key,String date){
			this.key=key;
			this.date=date;
		}
	}

}
相關文章
相關標籤/搜索