java数据结构和算法------二叉树基本操作

  1 package iYou.neugle.tree;
  2
  3 import java.util.ArrayList;
  4 import java.util.List;
  5
  6 public class Binary_Tree<T> {
  7     private Tree tree = new Tree();
  8
  9     class Tree {
 10         public T data;
 11         public Tree left;
 12         public Tree right;
 13     }
 14
 15     public enum Direction {
 16         left, right
 17     }
 18
 19     // 生成根节点
 20     public void CreateRoot(T data) {
 21         this.tree.data = data;
 22     }
 23
 24     // 插入节点到指定位置
 25     public boolean Insert(T parentData, T data, Direction direction) {
 26         if (this.TreeIsEmpty()) {
 27             System.out.println("树暂无节点,请先创建树");
 28             return false;
 29         }
 30         return this.InsertNode(this.tree, parentData, data, direction);
 31     }
 32
 33     private boolean InsertNode(Tree TreeNode, T parentData, T data,
 34             Direction direction) {
 35         if (TreeNode == null) {
 36             return false;
 37         }
 38         if (TreeNode.data.equals(parentData)) {
 39             Tree t = new Tree();
 40             t.data = data;
 41             if (direction == Direction.left) {
 42                 if (TreeNode.left == null) {
 43                     TreeNode.left = t;
 44                     return true;
 45                 } else {
 46                     System.out.println("该节点的左节点不为空!");
 47                 }
 48             } else {
 49                 if (TreeNode.right == null) {
 50                     TreeNode.right = t;
 51                     return true;
 52                 } else {
 53                     System.out.println("该节点的右节点不为空!");
 54                 }
 55             }
 56             return false;
 57         }
 58
 59         boolean b = InsertNode(TreeNode.left, parentData, data, direction);
 60
 61         if (!b) {
 62             return InsertNode(TreeNode.right, parentData, data, direction);
 63         } else {
 64             return b;
 65         }
 66
 67     }
 68
 69     // 获取二叉树深度
 70     public int Deep() {
 71         return this.TreeDeep(this.tree);
 72     }
 73
 74     private int TreeDeep(Tree tree) {
 75         int leftLen = 0;
 76         int rightLen = 0;
 77         if (tree == null) {
 78             return 0;
 79         }
 80         leftLen = this.TreeDeep(tree.left);
 81         rightLen = this.TreeDeep(tree.right);
 82         if (leftLen > rightLen) {
 83             return leftLen + 1;
 84         } else {
 85             return rightLen + 1;
 86         }
 87     }
 88
 89     // 判断二叉树是否为空
 90     public boolean TreeIsEmpty() {
 91         if (this.tree.data != null) {
 92             return false;
 93         }
 94         return true;
 95     }
 96
 97     // 根据值查找节点
 98     public Tree Query(T data) {
 99         return QueryTreeByValue(this.tree, data);
100     }
101
102     private Tree QueryTreeByValue(Tree tree, T data) {
103         if (tree == null) {
104             return null;
105         }
106         if (tree.data.equals(data)) {
107             System.out.println("----------");
108             System.out.println("查找到该节点,节点左子树为:"
109                     + (tree.left == null ? "无" : tree.left.data));
110             System.out.println("查找到该节点,节点右子树为:"
111                     + (tree.right == null ? "无" : tree.right.data));
112             System.out.println("----------");
113             return tree;
114         }
115         Tree t = QueryTreeByValue(tree.left, data);
116         if (t == null) {
117             return QueryTreeByValue(tree.right, data);
118         } else {
119             return t;
120         }
121     }
122
123     // 清空二叉树
124     public void ClearTree() {
125         this.tree = null;
126     }
127
128     // 先序遍历
129     public void DLR() {
130         this.Tree_DLR(this.tree);
131     }
132
133     private void Tree_DLR(Tree tree) {
134         if (tree == null) {
135             return;
136         }
137         System.out.println(tree.data);
138         this.Tree_DLR(tree.left);
139         this.Tree_DLR(tree.right);
140     }
141
142     // 中序遍历
143     public void LDR() {
144         this.Tree_LDR(this.tree);
145     }
146
147     private void Tree_LDR(Tree tree) {
148         if (tree == null) {
149             return;
150         }
151         this.Tree_LDR(tree.left);
152         System.out.println(tree.data);
153         this.Tree_LDR(tree.right);
154     }
155
156     // 后序遍历
157     public void LRD() {
158         this.Tree_LRD(this.tree);
159     }
160
161     private void Tree_LRD(Tree tree) {
162         if (tree == null) {
163             return;
164         }
165         this.Tree_LRD(tree.left);
166         this.Tree_LRD(tree.right);
167         System.out.println(tree.data);
168     }
169
170     // 层次遍历
171     public void Level() {
172         List<Tree> list = new ArrayList<Tree>();
173         list.add(this.tree);
174         while (!list.isEmpty()) {
175             Tree left = list.get(0).left;
176             Tree right = list.get(0).right;
177             if (left != null) {
178                 list.add(left);
179             }
180             if (right != null) {
181                 list.add(right);
182             }
183             System.out.println(list.get(0).data);
184             list.remove(0);
185         }
186     }
187 }
时间: 2024-07-30 04:03:02

java数据结构和算法------二叉树基本操作的相关文章

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

Java数据结构和算法(二)树的基本操作

Java数据结构和算法(二)树的基本操作 一.树的遍历 二叉树遍历分为:前序遍历.中序遍历.后序遍历.即父结点的访问顺序 1.1 前序遍历 基本思想:先访问根结点,再先序遍历左子树,最后再先序遍历右子树即根-左-右.图中前序遍历结果是:1,2,4,5,7,8,3,6. // 递归实现前序遍历 public void preOrder() { System.out.printf("%s ", value); if (left != null) { left.preOrder1(); }

Java数据结构和算法(一)

Java数据结构和算法(一) 一.数据结构 数据结构是计算机存储.组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率.数据结构往往同高效的检索算法和索引技术有关. 数据结构的基本功能: 如何插入一条新的数据项 如何寻找某一特定的数据项 如何删除某一特定的数据项 如何迭代的访问各个数据项,以便进行显示或其他操作 这几种结构优缺点如下:先有个大概印象,后面会详细讲解 二.算法 算法简单来说就是解决问题的步骤. 在 Java

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

java数据结构与算法之(Queue)队列设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53375004 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 java数据结构

java数据结构与算法之栈(Stack)设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53362993 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 ??本篇是jav