java实现二叉树相关代码-----数据结构

接口

/*1.开发时间:2014-11-5
 *2.开发者:赵远
 *3.维护者:赵远
 *3.程序说明:树的接口
 *4.注意事项:暂且没有
 * **/
package Tree;
import Tree.node;
public interface TreeNode {
// class Node {};
 // 1. 求二叉树中的节点个数
 int GetNodeNum(node root);
 // 2. 求二叉树的深度
 int GetDepth(node root);
 // 3. 前序遍历,中序遍历,后序遍历
 void PreOrderTraverse(node root);
 void InOrderTraverse(node root);
 void PostOrderTraverse(node root);
 // 4.分层遍历二叉树(按层次从上往下,从左往右)
 void LevelTraverse(node root);
// 5. 将二叉查找树变为有序的双向链表
// 6. 求二叉树第K层的节点个数
// 7. 求二叉树中叶子节点的个数
// 8. 判断两棵二叉树是否结构相同
// 9. 判断二叉树是不是平衡二叉树
// 10. 求二叉树的镜像
// 11. 求二叉树中两个节点的最低公共祖先节点
// 12. 求二叉树中节点的最大距离
// 13. 由前序遍历序列和中序遍历序列重建二叉树
// 14.判断二叉树是不是完全二叉树
}

 节点

package Tree;
//* 结点类。
public class node {
 public Object data; // 该节点存储的值。
 public node leftChild; // 指向左子节点的引用。
 public  node rightChild; // 指向右子节点的引用。
 public node(Object value) {
  this.data = value;
  leftChild = null;
  rightChild = null;
 }
}

具体实现

/*1.开发时间:2014-11-13
 *2.开发者:赵远
 *3.维护者:赵远
 *3.程序说明:二叉树的方法實現
 *4.注意事项:暂且没有
 * **/
package Tree;
import Tree.node;
import Tree.ArrayQueue;
public class BinaryTreeNode implements TreeNode {
 private node root; // 根节点
 BinaryTreeNode() {
  root = null;
 }
 // 1. 求二叉树中的节点个数
 // 递归解法:
 // (1)如果二叉树为空,节点个数为0
 // (2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1
 public int GetNodeNum(node root) {
  if (root == null) // 递归出口
   return 0;
  return GetNodeNum(root.rightChild) + GetNodeNum(root.leftChild) + 1;
 };
 // 2. 求二叉树的深度
 // 递归解法:
 // (1)如果二叉树为空,二叉树的深度为0
 // (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1
 public int GetDepth(node root) {
  if (root == null) // 递归出口
   return 0;
  int depthLeft = GetDepth(root.leftChild);
  int depthRight = GetDepth(root.rightChild);
  return depthLeft > depthRight ? (depthLeft + 1) : (depthRight + 1);
 };
 // 3. 前序遍历,中序遍历,后序遍历
 // 前序遍历递归解法:
 // (1)如果二叉树为空,空操作
 // (2)如果二叉树不为空,访问根节点,前序遍历左子树,前序遍历右子树
 // private void Visit(Node root){函数独立
 // if (root == null)
 // return ;
 // System.out.print("......");
 // Visit(root.leftChild); // 前序遍历左子树
 // Visit(root.rightChild); // 前序遍历右子树
 // };
 public void PreOrderTraverse(node root) {
  if (root == null)
   return;
  System.out.print(root.data + " ");
  PreOrderTraverse(root.leftChild);
  PreOrderTraverse(root.rightChild);
  // Visit(root); 函数独立
 };
 // 中序遍历递归解法
 // (1)如果二叉树为空,空操作。
 // (2)如果二叉树不为空,中序遍历左子树,访问根节点,中序遍历右子树
 public void InOrderTraverse(node root) {
  if (root == null)
   return;
  InOrderTraverse(root.leftChild);
  System.out.print(root.data + " ");
  InOrderTraverse(root.rightChild);
  //
 };
 // 后序遍历递归解法
 // (1)如果二叉树为空,空操作
 // (2)如果二叉树不为空,后序遍历左子树,后序遍历右子树,访问根节点
 public void PostOrderTraverse(node root) {
  PostOrderTraverse(root.leftChild);
  PostOrderTraverse(root.rightChild);
  System.out.print(root.data + " ");
 };
 // 4.分层遍历二叉树(按层次从上往下,从左往右)
 // 队列初始化,将根节点压入队列。
 // 当队列不为空,进行如下操作:弹出一个节点,访问,若左子节点或右子节
 // 点不为空,将其压入队列。
 public void LevelTraverse(node root) {
  ArrayQueue q = new ArrayQueue();
  if (root == null)
   return;
  q.enQueue(root);
  while (!q.isEmpty()) {
   root.data = q.getFront();
   q.deQueue();
   System.out.print(root.data + " "); // 访问节点
   if (root.leftChild != null)
    q.enQueue(root.leftChild);
   if (root.rightChild != null)
    q.enQueue(root.rightChild);
  }
  return;
 }
// 5. 求二叉树第K层的节点个数
// 递归解法:
// (1)如果二叉树为空或者k<1返回0
// (2)如果二叉树不为空并且k==1,返回1
// (3)如果二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树k-1层节点个数之和
 int GetNodeNumKthLevel(node root, int k)  
 {  
     if(root == null || k < 1)  
         return 0;  
     if(k == 1)  
         return 1;  
     int numLeft = GetNodeNumKthLevel(root.leftChild, k-1); // 左子树中k-1层的节点个数  
     int numRight = GetNodeNumKthLevel(root.rightChild, k-1); // 右子树中k-1层的节点个数  
     return (numLeft + numRight);  
 }  
// 6. 求二叉树中叶子节点的个数
// 递归解法:
// (1)如果二叉树为空,返回0
// (2)如果二叉树不为空且左右子树为空,返回1
// (3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数
 int GetLeafNodeNum(node root)  
 {  
     if(root == null)  
         return 0;  
     if(root.leftChild == null && root.rightChild == null)  
         return 1;  
     int numLeft = GetLeafNodeNum(root.leftChild); // 左子树中叶节点的个数  
     int numRight = GetLeafNodeNum(root.leftChild); // 右子树中叶节点的个数  
     return (numLeft + numRight);  
 }   
// 7. 判断两棵二叉树是否结构相同
// 不考虑数据内容。结构相同意味着对应的左子树和对应的右子树都结构相同。
// 递归解法:
// (1)如果两棵二叉树都为空,返回真
// (2)如果两棵二叉树一棵为空,另一棵不为空,返回假
// (3)如果两棵二叉树都不为空,如果对应的左子树和右子树都同构返回真,其他返回假
 boolean StructureCmp(node root1, node root2)  
 {  
     if(root1 == null && root2 == null) // 都为空,返回真  
         return true;  
     else if(root1 == null || root2 == null) // 有一个为空,一个不为空,返回假  
         return false;  
     boolean resultLeft = StructureCmp(root1.leftChild,root2.leftChild); // 比较对应左子树   
     boolean resultRight = StructureCmp(root1.rightChild, root2.rightChild); // 比较对应右子树  
     return (resultLeft && resultRight);  
 }   
// 8. 判断二叉树是不是平衡二叉树
// 递归解法:
// (1)如果二叉树为空,返回真
// (2)如果二叉树不为空,如果左子树和右子树都是AVL树并且左子树和右子树高度相差不大于1,返回真,其他返回假
 boolean IsAVL(node root, int  height)  
 {  
     if(root == null) // 空树,返回真  
     {  
         height = 0;  
         return true;  
     }  
     int heightLeft = 0;  
     boolean resultLeft = IsAVL(root.leftChild, heightLeft);  
     int heightRight = 0;  
     boolean resultRight = IsAVL(root.rightChild, heightRight);  
     if(resultLeft && resultRight && abs(heightLeft - heightRight) <= 1) // 左子树和右子树都是AVL,并且高度相差不大于1,返回真  
     {  
         height = max(heightLeft, heightRight) + 1;  
         return true;  
     }  
     else  
     {  
         height = max(heightLeft, heightRight) + 1;  
         return false;  
     }  
 }
 private int max(int heightLeft, int heightRight) {
  return heightLeft>heightRight?heightLeft:heightRight;
 }
 private int abs(int i) {
  if(i>0) return i;
  else return -i;
 }  
 //9.递归方法插入节点 
 public node insert(node root, Object x)
 {
     node p = null ;
     p.data=x;
     p.leftChild=null;
     p.rightChild=null;
     if(root == null){
         root = p;    
     }    
       
     else if(root.leftChild== null){
      root.leftChild = insert(root.leftChild,x);    
     }
     else if(root.rightChild== null){
         root.rightChild= insert(root.rightChild,x);    
     }
     return root;
 }
}

引用一个队列

package Tree;
/**
 *
 * @author 上课
 */
public class ArrayQueue implements Queue {
    private Object[] data;
    private int front;
    private int rear;
    public ArrayQueue(int capacity) {
        this.data = new Object[capacity];
        this.front = this.rear = 0;
    }
    public ArrayQueue() {
        this(1024);
    }
    public void clear() {
        this.front = this.rear = 0;
    }
    public boolean isEmpty() {
        return this.front == this.rear;
    }
    public Object getFront() {
        if (isEmpty()) {
            throw new UnsupportedOperationException("队列已空");
        }
        return data[front];
    }
    public void enQueue(Object o) {
        if (isFull()) {
            throw new UnsupportedOperationException("队列已满");
        }
        this.data[rear++] = o;
        rear %= data.length;
    }
    public Object deQueue() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    private boolean isFull() {
        return ((rear + 1) % data.length) == front;
    }
}
时间: 2024-10-27 17:03:50

java实现二叉树相关代码-----数据结构的相关文章

简单二叉树相关代码

1 #include <stdio.h> 2 3 typedef struct tagBinaryTree* Node; 4 typedef struct tagBinaryTree BinaryTree; 5 6 struct tagBinaryTree{ 7 int key; 8 Node lchild; 9 Node rchild; 10 Node parent; 11 }; 12 typedef struct //定义栈的结构体 13 { 14 Node *base; //在栈构造前和

Java实现二叉树及相关遍历方式

Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 下面用Java实现对二叉树的先序遍历,中序遍历,后序遍历.广度优先遍历.深度优先遍历.转摘请注明:http://blog.csdn.net/qiuzhping/article/details/44830369 package com.qiuz

java 重新抛出异常 相关处理结果示例代码

package org.rui.ExceptionTest; /** * 重新抛出异常 * 在某些情况下,我们想重新掷出刚才产生过的违例,特别是在用Exception 捕获所有可能的违例时.由于我 们已拥有当前违例的句柄,所以只需简单地重新掷出那个句柄即可.下面是一个例子: catch(Exception e) { System.out.println("一个违例已经产生"); throw e; } 重新"掷"出一个违例导致违例进入更高一级环境的违例控制器中.用于同

浅谈java类集框架和数据结构(2)

继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主要有最重要的三种实现:ArrayList,Vector,LinkedList,三种List均来自AbstracList的实现,而AbstracList直接实现了List接口,并拓展自AbstractCollection. 在三种实现中,ArrayList和Vector使用了数组实现,可以认为这两个是

MySQL源码:索引相关的数据结构

http://www.orczhou.com/index.php/2012/11/mysql-source-code-data-structure-about-index/ 本文将尝试介绍MySQL索引存储相关的数据结构.程序=数据结构+算法,了解数据结构,然后就可以进一步了解MySQL源码中如何使用索引,如何选择自己的执行计划. 目录 [hide] 1. MySQL如何描述某个数据表的索引 2. GDB打印观察索引信息 2.1 打印索引基本信息 2.2 打印索引某一列的基本信息 2.3 打印索

java实现二叉树的常见操作

本文转自:红客联盟 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合. 递归的三个条件: 边界条件 递归前进段 递归返回段 当边界条件不

答读者问(8):有关Java学习的相关问题

最近,我收到一位研究生朋友的邮件,大致内容如下: 周老师您好,我是XXX大学软件工程专业的一名研究生我叫XXX,学习的方向是java,有些问题不知道周老师能否帮我解惑下,在此谢谢老师! 1.我应该专注于后台的学习么?我在实际学习中,感觉到前台和后台也是分不开的总要涉及到,学习的过程中我学习了SSH大量的知识,再回头看看前台的一些技术jsp,html,css,jQuery感觉技术太多了,需要大量的练习记忆,不知道到底应该如何学习这些知识? 2.精通SSH(在此以SSH举个例子)等等技术到底需要个什

rabttmq php延迟消息 相关代码(网上没搜到自己琢磨着弄好了)

前言:  作为一个运维人员不背锅,谁背呢! 正文: 网上都是2种办法去实现,第二种我就不说了,要升级rabbitmq 别人也说什么什么不行 好吧~今天按照网上说的 TTL + DLX 的方式来实现 延迟消息(java的 python的相关代码都有 就是没有 拍huang片的!!!!) 撸代码咯: 1.首先得要创建一个新的队列 新的交换机来存放延迟消息 并且设置新的队列消息ttl到期后 转发的 交换机 和 routeing key (我的老的交换机为e_test  key 为k1) 主要代码为:

Kafka Producer相关代码分析

Kafka Producer相关代码分析 标签(空格分隔): kafka Kafka Producer将用户的消息发送到Kafka集群(准确讲是发送到Broker).本文将分析Producer相关的代码实现. 类kafka.producer.Producer 如果你自己实现Kafka客户端来发送消息的话,你就是用到这个类提供的接口来发送消息.(如果你对如何利用Producer API来发送消息还不是很熟悉的话,可以参看官方的例子).这个类提供了同步和异步两种方式来发送消息. 异步发送消息是基于同