• 算法——二叉树链表表示法


    public class BinaryTreeNode {
    	private int data;//数据
    	private BinaryTreeNode leftChild;//左孩子
    	private BinaryTreeNode rightChild;//右孩子
    	
    	public int getData() {
    		return data;
    	}
    	
    	public void setData(int data) {
    		this.data=data;
    	}
    	
    	public BinaryTreeNode getLeftChild() {
    		return leftChild;
    	}
    	
    	public void setLeftChild(BinaryTreeNode leftChirld) {
    		this.leftChild=leftChirld;
    	}
    	
    	public BinaryTreeNode getRightChild() {
    		return rightChild;
    	}
    	
    	public void setRightChild(BinaryTreeNode rightChild) {
    		this.rightChild=rightChild;
    	}
    	
    }
    

      

    public class BinaryTree {
    	
    	private BinaryTreeNode root;
    	
    	public BinaryTree(BinaryTreeNode root) {
    		this.root=root;
    	}
    	
    	public void setRoot(BinaryTreeNode root) {
    		this.root=root;
    	}
    	
    	public BinaryTreeNode getRoot() {
    		return root;
    	}
    	
    	/**
         * 二叉树的清空:
         * 首先提供一个清空以某个节点为根节点的子树的方法,既递归地删除每个节点;
         * 接着提供一个删除树的方法,直接通过第一种方法删除到根节点即可
         */
    	//清除某个子树的所有节点
    	public void clear(BinaryTreeNode node) {
    		if(node!=null) {
    			clear(node.getLeftChild());
    			clear(node.getRightChild());
    			node=null;//删除节点
    		}
    	}
    	
    	//清空树
    	public void clear() {
    		clear(root);
    	}
    	
    	//判断二叉树是否为空
    	public boolean isEmpty() {
    		return root==null;
    	}
    	
    	//获取以某节点为子树的高度
    	public int heigh(BinaryTreeNode node) {
    		if(node==null) {
    			return 0;//递归结束,空子树高度为0
    		}else {
    			//递归获取左子树高度
    			int l=heigh(node.getLeftChild());
    			//递归获取右子树高度
    			int r=heigh(node.getRightChild());
    			//高度应该算更高的一边,(+1是因为要算上自身这一层)
    			return l>r?(l+1):(r+1);
    		}
    		
    	}
    	
    	public int heigh() {
    		return heigh(root);
    	}
    	
    	/**
         * 求二叉树的节点数:
         * 1.求节点数时,我们看看获取某个节点为子树的节点数的实现。
         * 2.首先节点为空,则个数肯定为0;
         * 3.如果不为空,那就算上这个节点之后继续递归所有左右子树的子节点数,
         * 4.全部相加就是以所给节点为根的子树的节点数
         * 5.如果求二叉树的节点数,则输入根节点即可
         */
    	public int size(BinaryTreeNode node) {
    		if(node==null) {
    			return 0;//如果节点为空,则返回节点数为0
    		}else {
    			//计算本节点 所以要+1
                //递归获取左子树节点数和右子树节点数,最终相加
    			return 1+size(node.getLeftChild())+size(node.getRightChild());
    		}
    		
    	}
    	
    	//获取二叉树的节点数
    	public int size() {
    		return size(root);
    	}
    	
    	//返回某节点的父亲节点
    	//node节点在subTree子树中的父节点
    	public BinaryTreeNode getParent(BinaryTreeNode subTree,BinaryTreeNode node) {
    		if(subTree==null) {////如果是空子树,则没有父节点
    			return null;
    		}
    		//如果子树的根节点的左右孩子之一是待查节点,则返回子树的根节点
    		if(subTree.getLeftChild()==node||subTree.getRightChild()==node) {
    			return subTree;
    		}
    		BinaryTreeNode parent=null;
    		if(getParent(subTree.getLeftChild(), node)!=null) {
    			parent=getParent(subTree.getLeftChild(), node);
    			return parent;
    		}else {
    			//递归左右子树
    			return getParent(subTree.getRightChild(), node);
    		}
    	}
    	
    	//查找node节点在二叉树中的父节点
    	public BinaryTreeNode getParent(BinaryTreeNode node) {
    		return (root==null||root==node)?null:getParent(root,node);
    	}
    	
    	//返回左子树
    	public BinaryTreeNode getLeftTree(BinaryTreeNode node) {
    		return node.getLeftChild();
    	}
    	
    	//返回右子树
    	public BinaryTreeNode getRightTree(BinaryTreeNode node) {
    		return node.getRightChild();
    	}
    	
    	/**
    	 * 二叉树的插入:
    	 * 分两种情况:插入某个节点的左子节点;插入某个节点的右子节点
    	 * 值得指出的是,当这个节点本身有子节点时,这样的插入也会覆盖原来在这个位置上的节点。
    	 * 另外,虽然插入的是子节点,但是子节点也可以代表一颗子树。
    	 * 但从这个节点来看并不知道这个节点是否有左右子树存在,所以虽然插入的是一个节点,但有可能插入很多节点(插入的是一棵子树)
    	 */
    	
    	//给某个节点插入左节点
    	public void insertLeft(BinaryTreeNode parent,BinaryTreeNode newNode) {
    		parent.setLeftChild(newNode);
    	}
    	//给某个节点插入右节点
    	public void insertRight(BinaryTreeNode parent,BinaryTreeNode newNode) {
    		parent.setRightChild(newNode);
    	}
    	
    	//先序遍历
    	public void PreOrder(BinaryTreeNode node){
            if(node!=null){
                System.out.println(node.getData()); //先访问根节点
                PreOrder(node.getLeftChild());  //先根遍历左子树
                PreOrder(node.getRightChild());  //先根遍历右子树
            }
        }
    	
    	//中序遍历
    	public void InOrder(BinaryTreeNode node){
            if(node!=null){
                InOrder(node.getLeftChild());  //中根遍历左子树
                System.out.println(node);    //访问根节点
                InOrder(node.getRightChild());  //中根遍历右子树
            }
        }
    	
    	//后序遍历
    	public void PostOrder(BinaryTreeNode node){
            if(node!=null){
                PostOrder(node.getLeftChild());  //后根遍历左子树
                PostOrder(node.getRightChild());  //后根遍历右子树
                System.out.println(node);   //访问根节点
            }
        }
    	
    }
    

      

  • 相关阅读:
    Oracle中查询表中数据的上次更新时间
    数据库分区 分库 分表 分片(转)
    beanFactory和factoryBean的区别(转)
    TCP三次握手形象理解
    深拷贝,浅拷贝(转)
    真的要去做
    '庞然大物'是怎么来的?为何有的技术明明看了很多遍依然不能很好的理解
    java6大原则之单一职责原则,里式替换原则
    状态不好记录一下
    java继承,多态
  • 原文地址:https://www.cnblogs.com/wugongzi/p/11226434.html
Copyright © 2020-2023  润新知