zoukankan      html  css  js  c++  java
  • 【数据结构】- 二叉树基础操作

    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Queue;
    import java.util.Stack;
    import java.util.Vector;
    import java.util.concurrent.LinkedBlockingQueue;
    
    //2叉树常用操作练习
    public class BinaryTreeTest {
    	
    	//TEST
    	public static void main(String[] args) {
    		
    		BinaryTree<Integer> tree = null;
    		int[] temp = {5,8,4,7,3,1,6,9,0,2};
    		for(int i = 0 ; i < temp.length ; i++){
    			tree = buildTree(temp[i],tree);
    		}
    		preIteratorTree(tree);
    		midIteratorTree(tree);
    		postIteratorTreeOne(tree);
    		layoutIteratorTree(tree);
    		preIteratorTreeRecursion(tree);
    		System.out.println();
    		midIteratorTreeRecursion(tree);
    		System.out.println();
    		postIteratorTreeRecursion(tree);
    		System.out.println();
    		Integer count = treeLeafCount(tree,0);
    		System.out.println();
    		System.out.println(count);
    		System.out.println(treeHeight(tree));
    		exchangeTreeNode(tree);
    		preIteratorTree(tree);
    		System.out.println("isExist = " + nodeIsExist(tree,3));
    		System.out.println("isExist = " + nodeIsExist(tree,-1));
    		BinaryTree<Integer> node = nearestCommonParent(tree,6,9);
    		if(node == null) System.out.println("null");
    		else System.out.println(node.data);
    		node = nearestCommonParent(tree,2,-1);
    		if(node == null) System.out.println("null");
    		else System.out.println(node.data);
    		int[] at = {1,2,3,4,5,6,7,8,9,10};
    		BinaryTree<Integer> tree_ = buildBalanceTree(at,0,at.length-1,null);
    		midIteratorTreeRecursion(tree_);
    		System.out.println();
    		Vector<BinaryTree<Integer>> vector = new Vector<BinaryTree<Integer>>();
    		printPath(tree,22,vector);
    		for(int i = 0 ; i < vector.size() ; i++){
    			BinaryTree<Integer> temp_ = vector.get(i);
    			Vector<BinaryTree<Integer>> vectori = new Vector<BinaryTree<Integer>>();
    			nodePath(tree,temp_.data,vectori);
    			Collections.reverse(vectori);
    			for(int j = 0 ; j < vectori.size() ; j++){
    				System.out.print(vectori.get(j).data +  " ");
    			}
    			System.out.println();
    		}
    	}
    	
    	//先序遍历递归
    	private static void preIteratorTreeRecursion(BinaryTree<Integer> node){
    		
    		if(node != null){
    			System.out.print(node.data + "  ");
    			preIteratorTreeRecursion(node.lchild);
    			preIteratorTreeRecursion(node.rchild);
    		}
    	}
    	
    	//中序遍历递归
    	private static void midIteratorTreeRecursion(BinaryTree<Integer> node){
    		
    		if(node != null){
    			midIteratorTreeRecursion(node.lchild);
    			System.out.print(node.data + "  ");
    			midIteratorTreeRecursion(node.rchild);
    		}
    	}
    	
    	//后续遍历递归
    	private static void postIteratorTreeRecursion(BinaryTree<Integer> node){
    		
    		if(node != null){
    			postIteratorTreeRecursion(node.lchild);
    			postIteratorTreeRecursion(node.rchild);
    			System.out.print(node.data + "  ");
    		}
    	}
    	
    	//交换二叉树的左右儿子
    	private static void exchangeTreeNode(BinaryTree<Integer> node){
    		
    			BinaryTree<Integer> temp = null;
    			if(node != null){
    				temp = node.lchild;
    				node.lchild = node.rchild;
    				node.rchild = temp;
    				exchangeTreeNode(node.lchild);
    				exchangeTreeNode(node.rchild);
    			}
    	}
    	
    	//判断一个节点是否在一颗子树中
    	private static boolean nodeIsExist(BinaryTree<Integer> node,Integer data){
    		
    		if(node != null){
    			if(data == node.data){
    				return true;
    			}else{
    				boolean isExist1 = nodeIsExist(node.lchild,data);
    				boolean isExist2 = nodeIsExist(node.rchild,data);
    				return isExist1 || isExist2 ;
    			}
    		}
    		return false;
    	}
    	
    	//寻找行走路径
    	private static boolean nodePath(BinaryTree<Integer> node,Integer query,Vector<BinaryTree<Integer>> v){
    		
    		if(node != null){
    			if(query == node.data){
    				v.add(node);
    				return true;
    			}else{
    				boolean has = false;
    				if(nodePath(node.lchild,query,v)){
    					v.add(node);
    					has = true;
    				}
    				if(!has && nodePath(node.rchild,query,v)){
    					v.add(node);
    					has = true;
    				}
    				return has;
    			}
    		}
    		return false;
    	}
    	
    	//二叉树叶子节点个数递归先序遍历
    	private static Integer treeLeafCount(BinaryTree<Integer> node,Integer count){
    		
    		if(node.lchild == null && node.rchild == null){
    			System.out.print(node.data + "  ");
    			return ++count;
    			
    		}
    		if(node.lchild != null)
    			count = treeLeafCount(node.lchild , count);
    		if(node.rchild != null)
    			count = treeLeafCount(node.rchild , count);
    		return count;
    	}
    	
    	//求两个节点的最近公共祖先
    	private static BinaryTree<Integer> nearestCommonParent(BinaryTree<Integer> tree,Integer node1,Integer node2){
    		
    		Vector<BinaryTree<Integer>> v1 = new Vector<BinaryTree<Integer>>();
    		Vector<BinaryTree<Integer>> v2 = new Vector<BinaryTree<Integer>>();
    		if(nodePath(tree,node1,v1) && nodePath(tree,node2,v2)){
    			Collections.reverse(v1);
    			Collections.reverse(v2);
    			for(int i = 0 ; i < (v1.size() > v2.size() ? v1.size() : v2.size()) ; i++){
    				if(v1.size() > i && v2.size() > i){
    					if(v1.get(i) != v2.get(i)){
    						return v1.get(i-1);
    					}
    				}else{
    					i = v1.size() > v2.size() ? v2.size() : v1.size();
    					return v1.get(i-1);
    				}
    			}
    		}
    		return null;
    	}
    	
    	//从根节点开始找到所有路径,使得路径上的节点值和为某一数值(路径不一定以叶子节点结束)
    	private static void printPath(BinaryTree<Integer> node,int count,Vector<BinaryTree<Integer>> v){
    		
    		if(node == null || node.data > count || count < 0){
    			return ;
    		}else{
    			count -= node.data;
    			if(count == 0){
    				v.add(node);
    			}else{
    				printPath(node.lchild,count,v);
    				printPath(node.rchild,count,v);
    			}
    		}
    	}
    	
    	//求二叉树的高度
    	private static Integer treeHeight(BinaryTree<Integer> node){
    		
    		if(node == null){
    			return 0;
    		}
    		if(node.lchild == null && node.rchild == null){
    			return 1;
    		}
    		int height1 = treeHeight(node.lchild);
    		int height2 = treeHeight(node.rchild);
    		return  height1 - height2 > 0 ? ++height1 : ++height2;
    	}
    
    	
    	//建立2叉排序树
    	private static BinaryTree<Integer> buildTree(Integer data,BinaryTree<Integer> node){
    		
    		if(node == null){
    			node = new BinaryTree<Integer>(); 
    			node.data = data;
    		}else{
    			if(data < node.data){
    				node.setLchild(buildTree(data,node.lchild));
    			}else{
    				node.setRchild(buildTree(data,node.rchild));
    			}
    		}
    		return node;
    	}
    	
    	//中序遍历非递归
    	private static void midIteratorTree(BinaryTree<Integer> node){
    		
    		Stack<BinaryTree<Integer>> stack = new Stack<BinaryTree<Integer>>();
    		while(node != null || !stack.isEmpty()){
    			while(node != null){
    				stack.push(node);
    				node = node.lchild;
    			}
    			if(!stack.isEmpty()){
    				BinaryTree<Integer> temp = stack.pop();
    				System.out.print(temp.data + "  ");
    				node = temp.rchild;
    			}
    		}
    		System.out.println();
    	}
    	
    	//将一个排好序的数组,转变成一颗平衡二叉树(尽量平衡) 
    	private static BinaryTree<Integer> buildBalanceTree(int[] array,int start,int end,BinaryTree<Integer> root){
    		
    		int sign = 0;
    		if(end >= start){
    			sign = end > start ? (end + start ) / 2 : end;
    			if(root == null){
    				root = new BinaryTree<Integer>();
    				root.setData(array[sign]);
    			}
    			if(root != null){
    				root.setLchild(buildBalanceTree(array,start,sign-1,root.lchild));
    				root.setRchild(buildBalanceTree(array,sign+1,end,root.rchild));
    			}
    		}
    		return root;
    	}
    	
    	
    	//后序遍历非递归
    	private static void postIteratorTreeOne(BinaryTree<Integer> curr){
    		
    		Stack<BinaryTree<Integer>> stack = new Stack<BinaryTree<Integer>>();
    		Map<BinaryTree<Integer>,Boolean> stackHeadLocal = new HashMap<BinaryTree<Integer>,Boolean>();
    		
    		while(curr != null || !stack.isEmpty()){
    			while(curr != null){
    				stackHeadLocal.put(curr, true);
    				stack.push(curr);
    				curr = curr.lchild;
    			}
    			if(!stack.isEmpty()){
    				BinaryTree<Integer> temp = stack.lastElement();
    				if(temp.rchild != null && stackHeadLocal.get(temp)){
    					curr = temp.rchild;
    					stackHeadLocal.put(temp, false);
    				}else{
    					temp = stack.pop();
    					System.out.print(temp.data + "  ");
    				}
    			}
    		}
    		System.out.println();
    	}
    	
    	//先序遍历非递归
    	private static void preIteratorTree(BinaryTree<Integer> node){
    		
    		Stack<BinaryTree<Integer>> stack = new Stack<BinaryTree<Integer>>();
    		stack.push(node);
    		while(node != null || !stack.isEmpty()){
    			if(!stack.isEmpty()){
    				node = stack.pop();
    				System.out.print(node.data + "  ");
    			}
    			if(node.rchild != null){
    				stack.push(node.rchild);
    			}
    			if(node.lchild != null){
    				stack.push(node.lchild);
    			}
    			node = node.lchild;
    		}
    		System.out.println();
    	}
    	
    	//层次遍历2叉树
    	private static void layoutIteratorTree(BinaryTree<Integer> node){
    		
    		Queue<BinaryTree<Integer>> queue = new LinkedBlockingQueue<BinaryTree<Integer>>();
    		queue.offer(node);
    		while(!queue.isEmpty()){
    			if(!queue.isEmpty()){
    				node = queue.poll();
    				System.out.print(node.data + "  ");
    			}
    			if(node.lchild != null){
    				queue.offer(node.lchild);
    			}
    			if(node.rchild != null){
    				queue.offer(node.rchild);
    			}
    		}
    		System.out.println();
    	}
    	
    	static class BinaryTree<T>{
    		
    		private T data;
    		private BinaryTree<T> lchild;
    		private BinaryTree<T> rchild;
    		
    		public T getData() {
    			return data;
    		}
    		public void setData(T data) {
    			this.data = data;
    		}
    		public BinaryTree<T> getLchild() {
    			return lchild;
    		}
    		public void setLchild(BinaryTree<T> lchild) {
    			this.lchild = lchild;
    		}
    		public BinaryTree<T> getRchild() {
    			return rchild;
    		}
    		public void setRchild(BinaryTree<T> rchild) {
    			this.rchild = rchild;
    		}
    	}
    }
    
  • 相关阅读:
    VMware Workstation 11 安装MAC OS X 10.10 Yosemite(14B25)图解 2015-01-13 12:26:01|
    tensor搭建--windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速
    vs2015终于配置完成了
    Visual Studio 2015 update 3各版本下载地址
    惊艳的cygwin——Windows下的Linux命令行环境的配置和使用
    TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派
    官方Caffe-windows 配置与示例运行
    ipython notebook 如何打开.ipynb文件?
    Ubuntu16.04 +cuda8.0+cudnn+caffe+theano+tensorflow配置明细
    【CUDA】CUDA开发环境搭建
  • 原文地址:https://www.cnblogs.com/lixusign/p/3352557.html
Copyright © 2011-2022 走看看