`
endual
  • 浏览: 3566330 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 实现二叉树

 
阅读更多

在计算机科学中,树是一种非常重要的数据结构,而且有非常广泛的应用,例如linux下的目录结构就可以看成是一棵树,另外树也是存储大量的数据一种解决方法,二叉排序树是树的一种特殊情形,它的每个节点之多只能有两个子节点,同时左子树的节点都小于它的父节点,右子树中的节点都大于它的父节点,二叉排序树在搜索中的应用非常广泛,同时二叉排序树的一个变种(红黑树)是java中TreeMap和TreeSet的实现基础。下边是二叉排序树的定义,其中用到了两个类,一个是Node类,代表树中的节点,另外一个是Name类,表示节点的数据,Name类实现Comparable接口,这样才可以比较节点的大小。

?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 public class BinarySearchTree{
private Node root;
private int size;

public BinarySearchTree(Node root){
this.root=root;
size++;
}

public int getSize(){
return this.size;
}

public boolean contains(Name name){
return contains(name,this.root);
//return false;
}

private boolean contains(Name n,Node root){
if(root==null){
return false;
}
int compare=n.compareTo(root.element);
if(compare>0){
if(root.right!=null){
return contains(n,root.right);
}else{
return false;
}
}else if(compare<0){
if(root.left!=null){
return contains(n,root.left);
}else{
return false;
}
}else{
return true;
}
}

public boolean insert(Name n){
boolean flag = insert(n,this.root);
if(flag) size++;
return flag;
}

private boolean insert(Name n,Node root){
if(root==null){
this.root=new Node(n);
return true;
}else if(root.element.compareTo(n)>0){
if(root.left!=null){
return insert(n,root.left);
}else{
root.left=new Node(n);
return true;
}
}else if(root.element.compareTo(n)<0){
if(root.right!=null){
return insert(n,root.right);
}else{
root.right=new Node(n);
return true;
}
}else{
root.frequency++;
return true;
}
}

public boolean remove(Name name){
root = remove(name,this.root);
if(root != null){
size--;
return true;
}
return false;
}

private Node remove(Name name,Node root){
int compare = root.element.compareTo(name);
if(compare == 0){
if(root.frequency>1){
root.frequency--;
}else{
/**根据删除节点的类型,分成以下几种情况
**①如果被删除的节点是叶子节点,直接删除
**②如果被删除的节点含有一个子节点,让指向该节点的指针指向他的儿子节点
**③如果被删除的节点含有两个子节点,找到左字数的最大节点,并替换该节点
**/
if(root.left == null && root.right == null){
root = null;
}else if(root.left !=null && root.right == null){
root = root.left;
}else if(root.left == null && root.right != null){
root = root.right;
}else{
//被删除的节点含有两个子节点
Node newRoot = root.left;
while (newRoot.left != null){
newRoot = newRoot.left;//找到左子树的最大节点
}
root.element = newRoot.element;
root.left = remove(root.element,root.left);
}
}
}else if(compare > 0){
if(root.left != null){
root.left = remove(name,root.left);
}else{
return null;
}
}else{
if(root.right != null){
root.right = remove(name,root.right);
}else{
return null;
}
}
return root;
}

public String toString(){
//中序遍历就可以输出树中节点的顺序
return toString(root);
}

private String toString(Node n){
String result = "";
if(n != null){
if(n.left != null){
result += toString(n.left);
}
result += n.element + " ";
if(n.right != null){
result += toString(n.right);
}
}
return result;
}

}



在二叉排序树的操作中,节点的删除时最难处理的,要分成很多种情况分别进行处理,下边是Node类和Name类的定义:

?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 class Node{
public Name element;
public Node left;
public Node right;
public int frequency = 1;

public Node(Name n){
this.element=n;
}
}

class Name implements Comparable<Name>{
private String firstName;
private String lastName;

public Name(String firstName,String lastName){
this.firstName=firstName;
this.lastName=lastName;
}

public int compareTo(Name n) {
int result = this.firstName.compareTo(n.firstName);
return result==0?this.lastName.compareTo(n.lastName):result;
}

public String toString(){
return firstName + "-" +lastName;
}
}



最后是二叉排序树的测试:

?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public static void main(String[] args){
//System.out.println("sunzhenxing");
Node root = new Node(new Name("sun","zhenxing5"));
BinarySearchTree bst =new BinarySearchTree(root);
bst.insert(new Name("sun","zhenxing3"));
bst.insert(new Name("sun","zhenxing7"));
bst.insert(new Name("sun","zhenxing2"));
bst.insert(new Name("sun","zhenxing4"));
bst.insert(new Name("sun","zhenxing6"));
bst.insert(new Name("sun","zhenxing8"));
System.out.println(bst);
bst.remove(new Name("sun","zhenxing2"));
System.out.println(bst);
bst.remove(new Name("sun","zhenxing7"));
System.out.println(bst);
}

分享到:
评论

相关推荐

    Java实现二叉树的基本操作

    以上就是Java实现二叉树的基本操作的详细讲解,这些操作对于理解和应用数据结构在实际问题中非常重要。在Java中,二叉树的实现可以帮助我们解决许多算法问题,例如搜索、排序、路径查找等。通过熟练掌握这些操作,...

    java实现二叉树最佳方法

    总之,Java实现二叉树的最佳方法依赖于对二叉树性质的深入理解以及对Java语言特性的熟练应用。递归构建和遍历是实现二叉树的两个核心方面,它们共同构建了复杂二叉树算法的基石。在实际应用中,还需要考虑树结构的...

    Java实现二叉树的遍历

    java实现二叉树非递归前序中序后序遍历

    java实现二叉树数据结构

    java实现二叉树数据结构,简单明了,免费下载

    java实现二叉树遍历demo

    本示例"java实现二叉树遍历demo"将通过一个简单的实例来演示这三种遍历方式。 1. **前序遍历**: 前序遍历的顺序是:根节点 -&gt; 左子树 -&gt; 右子树。在代码实现中,通常采用递归的方法。首先访问根节点,然后递归地...

    Java实现二叉树,Java实现队列.pdf

    【Java实现二叉树】 在Java中,二叉树是一种数据结构,由多个节点组成,每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树的节点通常包含一个值以及指向其左子节点和右子节点的引用。在提供的代码中,...

    Java实现二叉树的相关操作

    以上就是Java实现二叉树的基本操作,包括创建、插入、删除和搜索节点,以及遍历二叉树的方法。这些操作为处理各种算法问题提供了基础,如二叉搜索树、平衡二叉树、堆等。掌握二叉树的原理和实现对于提升编程能力至关...

    Java实现二叉树中序线索化(图形界面 含代码)

    Java实现二叉树中序线索化 左键画节点 右键画跟 点可以拖动 两个节点可以连线 确认进行线索化 并画出线索

    java实现二叉树

    java实现2叉树 的一些简单的算法 例如 删除 插入 查找

    java实现二叉树遍历算法(源代码)

    ### Java实现二叉树遍历算法详解 #### 一、引言 在计算机科学中,二叉树是一种常用的数据结构,广泛应用于各种算法和数据处理场景。为了更好地理解和操作二叉树,掌握其遍历算法至关重要。本文将详细介绍如何使用...

    Java实现二叉树的先序、中序、后续、层次遍历

    在讲解Java实现二叉树的先序、中序、后序、层次遍历时,我们需要先了解几个关键知识点。 首先,二叉树是一种非常基础且重要的数据结构,每个节点最多有两棵子树,通常称这两棵子树为“左子树”和“右子树”。二叉树...

    java实现二叉树的遍历

    ### Java 实现二叉树的遍历 #### 一、数据结构分类 在计算机科学领域,数据结构可以按照逻辑结构和存储结构进行分类。 - **逻辑结构**: - **集合**:没有逻辑上的关系,如集合中的元素彼此独立。 - **线性结构*...

    用java实现二叉树的创建和遍历.doc

    本篇将详细阐述如何使用Java实现二叉树的创建和遍历。 首先,我们需要创建一个二叉树节点类`FOBiTree.java`,它包含以下属性和方法: 1. `char data`: 存储节点的值,例如字符。 2. `FOBiTree lNode`: 指向左子树...

    java实现二叉树程序

    java用队列实现的二叉树程序//入队 public void enqueue(E e); //出队 public E dequeue(); //取队列第一个 public E front(); //队列是否为空 public boolean isEmpty(); //队列大小 public int size...

    JAVA实现二叉树建立、遍历

    Java作为一种强大的面向对象编程语言,提供了丰富的数据结构支持,包括二叉树的实现。 首先,我们来看如何通过先序和中序序列建立二叉树。先序遍历顺序是:根节点 -&gt; 左子树 -&gt; 右子树;中序遍历顺序是:左子树 -&gt; ...

    Java实现二叉树的层次遍历

    本篇文章将详细探讨如何实现二叉树的层次遍历,即按照从根节点到叶子节点的层次顺序访问所有节点。 首先,我们需要定义二叉树节点的数据结构。在`BinaryTree.java`文件中,我们可以创建一个名为`Node`的类来表示树...

    java 二叉树实现

    java二叉树实现 (简单实现,入门用) /**创建二叉树*/ public BinaryTree createTree(String treeStr); /**寻找结点*/ public BinaryTree findNode(BinaryTree tree ,char sign); /**找所给结点的左子树*/ ...

    用Java实现二叉树的深度优先、广度优先遍历

    本篇文章将深入探讨如何使用Java来实现二叉树的深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search)。 **深度优先遍历** 是一种在图或树中搜索的方法,它尽可能深地探索树的分支...

Global site tag (gtag.js) - Google Analytics