zoukankan      html  css  js  c++  java
  •   参考:https://www.jianshu.com/p/bf73c8d50dc2
      二叉树:任何一个节点的子节点数量不超过2,二叉树的子节点分为左节点和右节点。
      满二叉树:所有叶子节点都在最后一层,而且节点的总数为:2^n-1,n是树的高度。
      完全二叉树:所有叶子节点都在最后一层或倒数第二层,且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续。
      创建二叉树:

    package demo5;
    
    public class Node {
    	//节点的权
    	int value;
    	//左儿子
    	Node leftNode;
    	//右儿子
    	Node rightNode;
    	
    	public Node(int value) {
    		this.value=value;
    	}
    	
    	//设置左儿子
    	public void setLeftNode(Node leftNode) {
    		this.leftNode = leftNode;
    	}
    	//设置右儿子
    	public void setRightNode(Node rightNode) {
    		this.rightNode = rightNode;
    	}
    	
    	//前序遍历
    	public void frontShow() {
    		//先遍历当前节点的内容
    		System.out.println(value);
    		//左节点
    		if(leftNode!=null) {
    			leftNode.frontShow();
    		}
    		//右节点
    		if(rightNode!=null) {
    			rightNode.frontShow();
    		}
    	}
    
    	//中序遍历
    	public void midShow() {
    		//左子节点
    		if(leftNode!=null) {
    			leftNode.midShow();
    		}
    		//当前节点
    		System.out.println(value);
    		//右子节点
    		if(rightNode!=null) {
    			rightNode.midShow();
    		}
    	}
    
    	//后序遍历
    	public void afterShow() {
    		//左子节点
    		if(leftNode!=null) {
    			leftNode.afterShow();
    		}
    		//右子节点
    		if(rightNode!=null) {
    			rightNode.afterShow();
    		}
    		//当前节点
    		System.out.println(value);
    	}
    
    	//前序查找
    	public Node frontSearch(int i) {
    		Node target=null;
    		//对比当前节点的值
    		if(this.value==i) {
    			return this;
    		//当前节点的值不是要查找的节点
    		}else {
    			//查找左儿子
    			if(leftNode!=null) {
    				//有可能可以查到,也可以查不到,查不到的话,target还是一个null
    				target = leftNode.frontSearch(i);
    			}
    			//如果不为空,说明在左儿子中已经找到
    			if(target!=null) {
    				return target;
    			}
    			//查找右儿子
    			if(rightNode!=null) {
    				target=rightNode.frontSearch(i);
    			}
    		}
    		return target;
    	}
    	
    	//删除一个子树
    	public void delete(int i) {
    		Node parent = this;
    		//判断左儿子
    		if(parent.leftNode!=null&&parent.leftNode.value==i) {
    			parent.leftNode=null;
    			return;
    		}
    		//判断右儿子
    		if(parent.rightNode!=null&&parent.rightNode.value==i) {
    			parent.rightNode=null;
    			return;
    		}
    		
    		//递归检查并删除左儿子
    		parent=leftNode;
    		if(parent!=null) {
    			parent.delete(i);
    		}
    		
    		//递归检查并删除右儿子
    		parent=rightNode;
    		if(parent!=null) {
    			parent.delete(i);
    		}
    	}
    
    }
    
    package demo5;
    
    public class BinaryTree {
    
    	Node root;
    	
    	//设置根节点
    	public void setRoot(Node root) {
    		this.root = root;
    	}
    	
    	//获取根节点
    	public Node getRoot() {
    		return root;
    	}
    
    	public void frontShow() {
    		if(root!=null) {
    			root.frontShow();
    		}
    	}
    
    	public void midShow() {
    		if(root!=null) {
    			root.midShow();
    		}
    	}
    
    	public void afterShow() {
    		if(root!=null) {
    			root.afterShow();
    		}
    	}
    
    	public Node frontSearch(int i) {
    		return root.frontSearch(i);
    	}
    
    	public void delete(int i) {
    		if(root.value==i) {
    			root=null;
    		}else {
    			root.delete(i);
    		}
    	}
    	
    }
    
    package demo5;
    
    public class TestBinaryTree {
    
    	public static void main(String[] args) {
    		//创建一颗树
    		BinaryTree binTree = new BinaryTree();
    		//创建一个根节点
    		Node root = new Node(1);
    		//把根节点赋给树
    		binTree.setRoot(root);
    		//创建一个左节点
    		Node rootL = new Node(2);
    		//把新创建的节点设置为根节点的子节点
    		root.setLeftNode(rootL);
    		//创建一个右节点
    		Node rootR = new Node(3);
    		//把新创建的节点设置为根节点的子节点
    		root.setRightNode(rootR);
    		//为第二层的左节点创建两个子节点
    		rootL.setLeftNode(new Node(4));
    		rootL.setRightNode(new Node(5));
    		//为第二层的右节点创建两个子节点
    		rootR.setLeftNode(new Node(6));
    		rootR.setRightNode(new Node(7));
    		//前序遍历树
    		binTree.frontShow();
    		System.out.println("===============");
    		//中序遍历
    		binTree.midShow();
    		System.out.println("===============");
    		//后序遍历
    		binTree.afterShow();
    		System.out.println("===============");
    		//前序查找
    		Node result = binTree.frontSearch(5);
    		System.out.println(result);
    		
    		System.out.println("===============");
    		//删除一个子树
    		binTree.delete(4);
    		binTree.frontShow();
    		
    	}
    
    }
    
  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/lihao-bupt/p/13025337.html
Copyright © 2011-2022 走看看