Java实现查找二叉树&C++的做法
写了个Java的查找二叉树,用递归做的,不用递归的还没弄出来。先贴一下。回头再研究。
BTreeTest.java:
public class BTreeTest{
class Node{
Node left, right;
int data; Node(int newData){
left = null;
right = null;
data = newData;
}
}
Node root = null;
int count = 0;
boolean canFind = false;
public void insert(int data){
root = insert(root, data);
} private Node insert(Node node, int data){
if(node == null){
node = new Node(data);
}else if(data <= node.data){
node.left = insert(node.left, data);
}else{
node.right = insert(node.right, data);
} return node;
} public void preOrder(){
preOrder(root);
}
private void preOrder(Node node){
if(node != null){
System.out.print(node.data + ",");
preOrder(node.left);
preOrder(node.right);
}
} public void inOrder(){
inOrder(root);
}
private void inOrder(Node node){
if(node != null){
inOrder(node.left);
System.out.print(node.data + ",");
inOrder(node.right);
}
} public void postOrder(){
postOrder(root);
}
private void postOrder(Node node){
if(node != null){
postOrder(node.left);
postOrder(node.right);
System.out.print(node.data + ",");
}
} public boolean search(int data){
search(data, root);
return canFind;
} private void search(int data, Node node)
{
if(node != null){
if(data == node.data){
canFind = true;
}else if(data < node.data){
count++;
search(data, node.left); }else if(data > node.data){
count++;
search(data, node.right);
}
}
} public void showCount(){
System.out.print("Count times: " + count);
} public static void main(String[] args){
BTreeTest tree = new BTreeTest();
int a[] = {6,5,7,1,9,8,10};
for(int i=0; i< 7; i++){
//printf("%d", a[i]);
System.out.println("Insert data=" + a[i]);
tree.insert(a[i]);
}
System.out.print("先序\n");
tree.preOrder();
System.out.print("\n中序\n");
tree.inOrder();
System.out.print("\n后序\n");
tree.postOrder(); int value = 4;
if(tree.search(value)){
System.out.println("Can find " + value);
}else{
System.out.println("Cannot find " + value);
}
tree.showCount();
}
}/** out put: ******
Insert data=6
Insert data=5
Insert data=7
Insert data=1
Insert data=9
Insert data=8
Insert data=10
前序:
6,5,1,7,9,8,10,
中序
1,5,6,7,8,9,10,
后序
1,5,8,10,9,7,6,
层次
6,5,7,1,9,8,10,
14 is not in the tree,search for 4
*/
参考了C++实现的代码:http://www.cppblog.com/emptysoul/archive/2008/11/24/67747.html,其实以上的代码基本就是看了之后敲成Java代码...
转帖一下:
BTree.h:
#ifndef BTREE_H
#define BTREE_H
#include <iostream>
#include <queue>
using namespace std; static int findcounts; //用于测试查找某节点的次数
template<class T>
class BTree
{
//定义树节点,包括一个数据,两个指针
struct BNode
{
BNode(T dat, BNode* l, BNode* r) : data(dat), left(l), right(r){};
T data;
BNode *left, *right;
}* root; //插入一个节点,
void Insert(const T& data, BNode*& p)
{
if(p == )
{
p = new BNode(data, , );
std::cout << "Insert data=" << data << std::endl;
}
else if(data < p->data)
{
//插入数据小于父节点数据,插入左子树
Insert(data, p->left);
}
else if(data > p->data)
{
//插入数据小于父节点数据,插入右子树
Insert(data, p->right);
}
} //先序遍历
void PreOrder (BNode* p)
{
if(p != )
{
Print(p);
PreOrder (p->left);
PreOrder (p->right);
}
} //中序遍历
void InOrder (BNode* p)
{
if(p != )
{
InOrder (p->left);
Print(p);
InOrder (p->right);
}
} //后序遍历
void PostOrder (BNode* p)
{
if(p != )
{
PostOrder (p->left);
PostOrder (p->right);
Print(p);
}
} //查找节点
bool Find(const T& data, BNode* p)
{
if(p != )
{
if(data == p->data)
{
return true;
}
else if(data < p->data)
{
findcounts ++;
Find(data, p->left);
}
else
{
findcounts ++;
Find(data, p->right);
}
}
else
{
return false;
}
} //删除整棵树
void MakeEmpty(BNode* p)
{
if(p != )
{
MakeEmpty(p->left);
MakeEmpty(p->right);
std::cout << "del " << p->data << ",";
delete p;
}
}
public:
BTree() : root(){} ~BTree()
{
MakeEmpty(root);
} void Insert(const T& data)
{
Insert(data, root);
} void PreOrder()
{
//递归,前序遍历
PreOrder(root);
} void InOrder()
{
//递归,中序遍历
InOrder(root);
} void PostOrder()
{
//递归,后序遍历
PostOrder(root);
} //层次遍历,使用队列的特性实现树的非递归遍历
void LevelOrder ()
{
queue<BNode*> q;
BNode* p = root;
while(p)
{
Print(p);
if(p->left != )
{
q.push(p->left);
}
if(p->right != )
{
q.push(p->right);
}
if (q.empty())
{
break;
}
p = q.front();
q.pop();
}
} //打印一个节点值
void Print(BNode* p)
{
if(p != )
{
std::cout << p->data << ",";
}
} //打印一个节点的查找次数
void PrintStatic()
{
std::cout << findcounts;
} //递归查找一个节点
bool Find(const T& data)
{
findcounts = ;
return Find(data, root);
}
};
#endif
Test.cpp:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stdio.h>
#include "BTree.h" using namespace std; int main(int argc, char *argv[])
{
//随机生成一棵树
BTree<int> tree;
srand((unsigned)time(NULL));
//for(int i=0; i<20; ++i)
// {
// int var = rand() / 20;
// printf("%d", var);
// tree.Insert(var);
// }
int a[] = {,,,,,,};
for(int i=; i< ; i++){
//printf("%d", a[i]);
tree.Insert(a[i]);
} cout << "前序:" << endl;
tree.PreOrder();
cout << endl;
cout << "中序" << endl;
tree.InOrder();
cout << endl;
cout << "后序" << endl;
tree.PostOrder();
cout << endl;
cout << "层次" << endl;
tree.LevelOrder();
cout << endl; if(tree.Find())
{
cout << "6 is in the tree,search for " ;
tree.PrintStatic();
cout << endl;
}
else
{
cout << "14 is not in the tree,search for " ;
tree.PrintStatic();
cout << endl;
}
system("PAUSE");
//return 0;
}
/** out put: ******
Insert data=6
Insert data=5
Insert data=7
Insert data=1
Insert data=9
Insert data=8
Insert data=10
前序:
6,5,1,7,9,8,10,
中序
1,5,6,7,8,9,10,
后序
1,5,8,10,9,7,6,
层次
6,5,7,1,9,8,10,
14 is not in the tree,search for 4
*/
Java实现查找二叉树&C++的做法的更多相关文章
- java学习之—二叉树
package com.data.java.towtree; import java.io.IOException; /** * 二叉树 * @Title: uminton */ class Node ...
- 利用Java实现表达式二叉树
(*^-^*) 什么是二叉树,这里不再介绍,可以自行百度:二叉树.在这里利用java实现“表达式二叉树”. 表达式二叉树的定义 第一步先要搞懂表达式二叉树是个什么东东?举个栗子,表达式:(a+b×(c ...
- 数据结构与算法(c++)——查找二叉树与中序遍历
查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) # ...
- Java递归方法遍历二叉树的代码
将内容过程中经常用的内容做个记录,如下内容内容是关于Java递归方法遍历二叉树的内容. package com.wzs; public class TestBinaryTree { public st ...
- 查找二叉树(tree_a)
问题 E: 查找二叉树(tree_a) 时间限制: 1 Sec 内存限制: 128 MB提交: 206 解决: 152[提交][状态][讨论版][命题人:quanxing][Edit] [Test ...
- Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un
ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素 Java 实例 以下实例 ...
- Java-Runoob-高级教程-实例-字符串:02. Java 实例 - 查找字符串最后一次出现的位置
ylbtech-Java-Runoob-高级教程-实例-字符串:02. Java 实例 - 查找字符串最后一次出现的位置 1.返回顶部 1. Java 实例 - 查找字符串最后一次出现的位置 Jav ...
- Java顺序查找、二分查找
Java顺序查找.二分查找 查找算法中顺序查找算是最简单的了,无论是有序的还是无序的都可以,只需要一个个对比即可,但其实效率很低. 顺序查找 动图演示 详细代码 // 顺序查找 public st ...
- Java递归查找层级文件夹下特定内容的文件
递归查找文件 引言 或许是文件太多,想找某个文件又忘记放哪了;又或者是项目改造,需要将外部调用接口进行改造,项目太多,又无法排查.那么怎么快速找到自己想要的内容就是一件值得思考的事情了. 根据特定内容 ...
随机推荐
- Java性能优化技巧集锦
一.通用篇 "通用篇"讨论的问题适合于大多数Java应用. 1.1 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的全部构造函数都会被自己主动调用.但假设 ...
- MAVEN Error: Using platform encoding (GBK actually) to copy filtered resources.....
环境:Maven3.2.5+MyEclipse 2015CI 现象:在Maven编译过程中出现错误信息:Using platform encoding (GBK actually) to copy f ...
- Java反射学习总结一(基础篇)
Class类是Reflection API中核心的类,他位于Java.lang.Class 列出一些常用的方法. - getName() : 获得类的完整名字 - getFields() : 获得类的 ...
- Docker搭建ES
Centos7安装ES 和 Docker搭建ES 文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.linux centos7.x安装ES ...
- Android Studio SVN使用和VisualSVN-Server配置(图解)
转载请标明出处: http://blog.csdn.net/zq2114522/article/details/51078544: 本文出自:[梁大盛的博客] Android Studio SVN使用 ...
- JS中给函数参数添加默认值(多看课程)
JS中给函数参数添加默认值(多看课程) 一.总结 一句话总结:咋函数里面是可以很方便的获取调用函数的参数的,做个判断就好,应该有简便方法,看课程. 二.JS中给函数参数添加默认值 最近在Codewar ...
- IOC功能以及相关的配置
功能: 控制反转,将对象的创建权反转给Spring可以解决程序耦合性高的问题,大概的意思就是将程序运行时所需要的资源.数据,全部让Spring供给,防止程序与程序之间联系过高,而出现耦合性高的问题. ...
- MouseGestureL.ini shift up/down/left/right edge
MouseGestureL.ini [ShiftPress]Icon=C:\Windows\System32\explorer.exe,6Custom=GetKeyState("Shift& ...
- http://lists.mysql.com/mysql
http://lists.mysql.com/mysql http://www.ehowstuff.com/how-to-fix-mysql-database-error-cant-create-da ...
- [Ramda] Eliminate Function Arguments (Point-Free Style) with Ramda's Converge
When doing comparisons inside of functions, you end of relying heavily on the argument passed into t ...