二叉树

普通二叉树的结构、生成、前序遍历、中序遍历、后序遍历、树深度、输出某点之后的中序遍历节过等

package TestTree;

import java.util.ArrayList;
import java.util.List;

public class Tree {
    private Node root;
    private List<Node> list=new ArrayList<Node>();
    private boolean bool = false;
    private boolean bool1 = false;
    public Tree(){
        init();
    }
    //树的初始化:先从叶节点开始,由叶到根
    public void init(){
        Node x=new Node("X",null,null);
        Node y=new Node("Y",null,null);
        Node z=new Node("Z",null,null);
        Node d=new Node("d",x,y);
        Node e=new Node("e",null,null);
        Node f=new Node("f",null,null);
        Node c=new Node("c",e,f);
        Node g=new Node("g",z,null);
        Node b=new Node("b",d,g);
        Node a=new Node("a",b,c);
        root =a;
    }
    //定义节点类:
    private class Node{
      private String data;
      private Node lchid;//定义指向左子树的指针
      private Node rchild;//定义指向右子树的指针
      public Node(String data,Node lchild,Node rchild){
          this.data=data;
          this.lchid=lchild;
          this.rchild=rchild;
      }
    }

    /**
      * 对该二叉树进行前序遍历 结果存储到list中 前序遍历:ABDXYCEF
      */
     public void preOrder(Node node)
     {

            list.add(node); //先将根节点存入list
            //如果左子树不为空继续往左找,在递归调用方法的时候一直会将子树的根存入list,这就做到了先遍历根节点
            if(node.lchid != null)
            {
                preOrder(node.lchid);
            }
            //无论走到哪一层,只要当前节点左子树为空,那么就可以在右子树上遍历,保证了根左右的遍历顺序
            if(node.rchild != null)
            {
                preOrder(node.rchild);
            }
     }

     /**
      * 对该二叉树进行中序遍历 结果存储到list中
      */
     public void inOrder(Node node)
     {
        if(node.lchid!=null){
            inOrder(node.lchid);
        }
        list.add(node);
        if(node.rchild!=null){
            inOrder(node.rchild);
        }
     }
     
     /**
      * 对该二叉树进行中序遍历某个节点之后的所有节点  结果存储到list中
      */
     public void inOrderMark(Node node, String mark)
     {
    	
        if(node.lchid!=null){
        	inOrderMark(node.lchid, mark);
        }
        if(bool) list.add(node);
        if(node.data.equals(mark)) bool = true;
        if(node.rchild!=null){
        	inOrderMark(node.rchild, mark);
        }
     }

     /**
      * 对该二叉树进行后序遍历 结果存储到list中
      */
     public void postOrder(Node node)
     {
         if(node.lchid!=null){
             postOrder(node.lchid);
         }
         if(node.rchild!=null){
             postOrder(node.rchild);
         }
         list.add(node);

     }

     /**
      * 返回当前树的深度
      *  说明:
      *  1、如果一棵树只有一个结点,它的深度为1。
      *  2、如果根结点只有左子树而没有右子树,那么树的深度是其左子树的深度加1;
      *  3、如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1;
      *  4、如果既有右子树又有左子树,那该树的深度就是其左、右子树深度的较大值再加1。
      *  
      * @return
      */
     public int getTreeDepth(Node node) {

            if(node.lchid == null && node.rchild == null)
            {
                return 1;
            }
            int left=0,right = 0;
            if(node.lchid!=null)
            {
                left = getTreeDepth(node.lchid);
            }
            if(node.rchild!=null)
            {
                right = getTreeDepth(node.rchild);
            }
            return left>right?left+1:right+1;
        }

     //找出一个完全二叉树中最后一层的最后一个节点
     public void getLastPoint(Node node){
    	 int deep = getDeep(node);
    	 getLastNode(node, deep, 0);
     }
     public void getLastNode(Node node, int deep, int height){
    	 if(bool1) return;
    	 height++;
    	 if(node.rchild == null && node.lchid == null && height == deep){
    		 System.out.println(node.data);
    		 bool1 = true;
    		 return;
    	 }
    	 if(node.rchild != null){
    		 getLastNode(node.rchild, deep, height);
    	 }
    	 if(node.lchid != null){
        	 getLastNode(node.lchid, deep, height);
    	 }
     }
     public int getDeep(Node node){
    	 int height = 1;
    	 while(node.lchid != null){
    		 height++;
    		 node = node.lchid;
    	 }
    	 return height;
     }

    //得到遍历结果
     public List<Node> getResult()
     {
      return list;
     }

     public static void main(String[] args) {
        Tree tree=new Tree();
        System.out.println("根节点是:"+tree.root.data);
        //tree.preOrder(tree.root);
//        tree.inOrder(tree.root);
//        tree.postOrder(tree.root);
        tree.inOrderMark(tree.root, "b");
        for(Node node:tree.getResult()){
            System.out.println(node.data);
        }
        System.out.println("树的深度是"+tree.getTreeDepth(tree.root));
        tree.getLastPoint(tree.root);
    } 

}

二叉排序树

package TestTree;
//二叉排序树
public class sortTree {
	private Node root;
//	private List<Node> 
	//节点类
	class Node{
		private int val;
		private Node left;
		private Node right;
		public Node(int val){
			this.val = val;
		}
	}
	
	//对应数组生成二叉排序树
	public Node getBST(int[] nums){
		Node node = new Node(nums[0]);
		for(int i = 1; i < nums.length; i++)
			bornSortTree(node, nums[i]);
		return node;
	}
	public Node bornSortTree(Node node, int i){
		if(node == null){  
            node = new Node(i);  
            return node;  
        }  
        else{  
            if(i <= node.val){  
                node.left =  bornSortTree(node.left, i);  
            }  
            else{  
                node.right = bornSortTree(node.right,i);  
            }  
            return node;  
        }  
	}
	//中序遍历二叉排序树
	public void inOrder(Node node){
		if(node.left != null) inOrder(node.left);
		System.out.println(node.val);
		if(node.right != null) inOrder(node.right);
	}
	public static void main(String[] args) {
		sortTree tree = new sortTree();
		int[] nums = {3,1,2,5,0,7,9,8};
		tree.root = tree.getBST(nums);
		tree.inOrder(tree.root);
	}
}

  

posted @ 2018-01-24 16:16  K_artorias  阅读(242)  评论(0编辑  收藏  举报