二叉树的Java实现及特点总结

二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加。但是他也有自己的缺点:删除操作复杂。

我们先介绍一些关于二叉树的概念名词。

二叉树:是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到节点中的,一个节点的左子节点的关键值必须小于此节点,右子节点的关键值必须大于或者是等于此节点,所以又称二叉查找树、二叉排序树、二叉搜索树。

完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

深度——二叉树的层数,就是深度。

二叉树的特点总结:

(1)树执行查找、删除、插入的时间复杂度都是O(logN)

(2)遍历二叉树的方法包括前序、中序、后序

(3)非平衡树指的是根的左右两边的子节点的数量不一致

(4) 在非空二叉树中,第i层的结点总数不超过 , i>=1;

(5)深度为h的二叉树最多有个结点(h>=1),最少有h个结点;

(6)对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;

二叉树的Java代码实现

首先是树的节点的定义,下面的代码中使用的是最简单的int基本数据类型作为节点的数据,如果要使用节点带有更加复杂的数据类型,换成对应的对象即可。

/**
 * 
 * @ClassName: com.tree.TreeNode
 * @Description: 节点
 * @author zhaokaiqiang
 * @date 2014-12-5 下午4:43:24
 * 
 */
public class TreeNode {

// 左节点
 private TreeNode lefTreeNode;
 // 右节点
 private TreeNode rightNode;
 // 数据
 private int value;

private boolean isDelete;

public TreeNode getLefTreeNode() {
  return lefTreeNode;
 }

public void setLefTreeNode(TreeNode lefTreeNode) {
  this.lefTreeNode = lefTreeNode;
 }

public TreeNode getRightNode() {
  return rightNode;
 }

public void setRightNode(TreeNode rightNode) {
  this.rightNode = rightNode;
 }

public int getValue() {
  return value;
 }

public void setValue(int value) {
  this.value = value;
 }

public boolean isDelete() {
  return isDelete;
 }

public void setDelete(boolean isDelete) {
  this.isDelete = isDelete;
 }

public TreeNode() {
  super();
 }

public TreeNode(int value) {
  this(null, null, value, false);
 }

public TreeNode(TreeNode lefTreeNode, TreeNode rightNode, int value,
   boolean isDelete) {
  super();
  this.lefTreeNode = lefTreeNode;
  this.rightNode = rightNode;
  this.value = value;
  this.isDelete = isDelete;
 }

@Override
 public String toString() {
  return "TreeNode [lefTreeNode=" + lefTreeNode + ", rightNode="
    + rightNode + ", value=" + value + ", isDelete=" + isDelete
    + "]";
 }

}

下面给出二叉树的代码实现。由于在二叉树中进行节点的删除非常繁琐,因此,下面的代码使用的是利用节点的isDelete字段对节点的状态进行标识

/**
 * 
 * @ClassName: com.tree.Tree
 * @Description: 二叉树的定义
 * @author zhaokaiqiang
 * @date 2014-12-8 上午7:51:49
 * 
 */

public class BinaryTree {

// 根节点
 private TreeNode root;

public TreeNode getRoot() {
  return root;
 }

/**
  * 插入操作
  * 
  * @param value
  */
 public void insert(int value) {

TreeNode newNode = new TreeNode(value);

if (root == null) {
   root = newNode;
   root.setLefTreeNode(null);
   root.setRightNode(null);
  } else {

TreeNode currentNode = root;
   TreeNode parentNode;

while (true) {

parentNode = currentNode;
    // 往右放
    if (newNode.getValue() > currentNode.getValue()) {
     currentNode = currentNode.getRightNode();
     if (currentNode == null) {
      parentNode.setRightNode(newNode);
      return;
     }
    } else {
     // 往左放
     currentNode = currentNode.getLefTreeNode();
     if (currentNode == null) {
      parentNode.setLefTreeNode(newNode);
      return;
     }

}
   }
  }
 }

/**
  * 查找
  * 
  * @param key
  * @return
  */
 public TreeNode find(int key) {

TreeNode currentNode = root;

if (currentNode != null) {

while (currentNode.getValue() != key) {

if (currentNode.getValue() > key) {
     currentNode = currentNode.getLefTreeNode();
    } else {
     currentNode = currentNode.getRightNode();
    }

if (currentNode == null) {
     return null;
    }

}

if (currentNode.isDelete()) {
    return null;
   } else {
    return currentNode;
   }

} else {
   return null;
  }

}

/**
  * 中序遍历
  * 
  * @param treeNode
  */
 public void inOrder(TreeNode treeNode) {
  if (treeNode != null && treeNode.isDelete() == false) {
   inOrder(treeNode.getLefTreeNode());
   System.out.println("--" + treeNode.getValue());
   inOrder(treeNode.getRightNode());
  }
 }

}

在上面对二叉树的遍历操作中,使用的是中序遍历,这样遍历出来的数据是增序的。

下面是测试代码:

public class Main {

public static void main(String[] args) {

BinaryTree tree = new BinaryTree();
  // 添加数据测试
  tree.insert(10);
  tree.insert(40);
  tree.insert(20);
  tree.insert(3);
  tree.insert(49);
  tree.insert(13);
  tree.insert(123);

System.out.println("root=" + tree.getRoot().getValue());
  // 排序测试
  tree.inOrder(tree.getRoot());
  // 查找测试
  if (tree.find(10) != null) {
   System.out.println("找到了");
  } else {
   System.out.println("没找到");
  }
  // 删除测试
  tree.find(40).setDelete(true);

if (tree.find(40) != null) {
   System.out.println("找到了");
  } else {
   System.out.println("没找到");
  }

}

}

时间: 2024-10-03 13:22:41

二叉树的Java实现及特点总结的相关文章

【数据结构】之二叉树的java实现

二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 这个定义是递归的.由于左.右子树也是二叉树, 因此子树也可为空树.下图中展现了五种不同基本形态的二叉树. 其中 (a) 为空树, (b

【数据结构与算法】二叉树的Java实现及特点总结

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树:是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到节点中的,一个节点的左子节点的关键值必须小于此节点,右子节点的关键值必须大于或者是等于此节点,所以又称二叉查找树.二叉排序树.二叉搜索

【数据结构】二叉树的Java实践

二叉树,是常用的树之一. 性质: 每个节点最多有2个节点(即度最大为2) 有左.右节点(或左.右子树)之分,且节点有顺序之分(即左.右不能随意调换) 下面对二叉树做最简单的Java实践. > 二叉树的Java实践 树节点 package com.nicchagil.btree; public class TreeNode { private Integer value; private TreeNode left; private TreeNode right; public TreeNode(

排序二叉树及其Java实现

定义 排序二叉树的定义也是递归定义的,需要满足: (1)若它的左子树不为空,则左子树上所有节点的值要均小于根节点的值: (2)若它的右子树不为空,则右子树上所有节点的值要均大于根节点的值: (3)左.右子树也分别是排序二叉树 如下图,对于排序二叉树,若按中序遍历就可以得到由小到大的有序序列. 创建 创建排序二叉树的步骤就是不断像排序二叉树中添加新节点(p)的过程: (1)以根节点(root)为当前节点(current)开始搜索: (2)用新节点p的值和current的值进行比较: (3)如果p.

【数据结构】二叉树的java实现

二叉树概述 数组.向量.链表都是一种顺序容器,它们提供了按位置访问数据的手段.而很多情况下,我们需要按数据的值来访问元素,而不是它们的位置来访问元素.比如有这样一个数组int num[3]={1,2,3},我们可以非常快速的访问数组中下标为2的数据,也就是说我们知道这个数据的位置,就可以快速访问.有时候我们是不知道元素的位置,但是却知道它的值是多少.假设我们有一个变量,存放在num这个数组中,我们知道它的值为2,却不知道它下标是多少,也就是说不知道它的位置.这个时候再去数组中访问这个元素就比较费

二叉树的java实现

import java.util.Arrays; import java.util.Stack; // 链式存储的二叉树 public class BSTree { private TreeNode root = null; public TreeNode getRoot() { return root; } public BSTree(TreeNode root) { this.root = root; } public boolean isEmpty() { return root == n

Pro 6 重建二叉树(java)

注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 1 package com.xsf.SordForOffer; 2 3 import java.util.Arrays; 4 5 /*剑指offer第6个问题 6 根据前序和中序遍历来重建二叉树 7 */ 8 class BinaryTreeNode { 9 public int value; 10 public BinaryTreeNod

二叉树之Java实现二叉树基本操作

参考自<Java数据结构与算法> 定义一个节点类,使节点与二叉树操作分离 class Node { int value; Node leftChild; Node rightChild; Node(int value) { this.value = value; } public void display() { System.out.print(this.value + "\t"); } @Override public String toString() { // TO

链式存储二叉树(java)

 链式存储一个完全二叉树代码: //二叉树(链式存储) import java.util.ArrayDeque; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Stack; public class MyTree { static Node root; class Node{ private Node lChild; private Node rChild;