写了个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++的做法的更多相关文章

  1. java学习之—二叉树

    package com.data.java.towtree; import java.io.IOException; /** * 二叉树 * @Title: uminton */ class Node ...

  2. 利用Java实现表达式二叉树

    (*^-^*) 什么是二叉树,这里不再介绍,可以自行百度:二叉树.在这里利用java实现“表达式二叉树”. 表达式二叉树的定义 第一步先要搞懂表达式二叉树是个什么东东?举个栗子,表达式:(a+b×(c ...

  3. 数据结构与算法(c++)——查找二叉树与中序遍历

    查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) # ...

  4. Java递归方法遍历二叉树的代码

    将内容过程中经常用的内容做个记录,如下内容内容是关于Java递归方法遍历二叉树的内容. package com.wzs; public class TestBinaryTree { public st ...

  5. 查找二叉树(tree_a)

    问题 E: 查找二叉树(tree_a) 时间限制: 1 Sec  内存限制: 128 MB提交: 206  解决: 152[提交][状态][讨论版][命题人:quanxing][Edit] [Test ...

  6. Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un

    ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素  Java 实例 以下实例 ...

  7. Java-Runoob-高级教程-实例-字符串:02. Java 实例 - 查找字符串最后一次出现的位置

    ylbtech-Java-Runoob-高级教程-实例-字符串:02. Java 实例 - 查找字符串最后一次出现的位置 1.返回顶部 1. Java 实例 - 查找字符串最后一次出现的位置  Jav ...

  8. Java顺序查找、二分查找

    Java顺序查找.二分查找   查找算法中顺序查找算是最简单的了,无论是有序的还是无序的都可以,只需要一个个对比即可,但其实效率很低. 顺序查找 动图演示 详细代码 // 顺序查找 public st ...

  9. Java递归查找层级文件夹下特定内容的文件

    递归查找文件 引言 或许是文件太多,想找某个文件又忘记放哪了;又或者是项目改造,需要将外部调用接口进行改造,项目太多,又无法排查.那么怎么快速找到自己想要的内容就是一件值得思考的事情了. 根据特定内容 ...

随机推荐

  1. HDU 1212 Big Number 大数模小数

    http://acm.hdu.edu.cn/showproblem.php?pid=1212 题目大意: 给你一个长度不超过1000的大数A,还有一个不超过100000的B,让你快速求A % B. 什 ...

  2. 【57.97%】【codeforces Round #380A】Interview with Oleg

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  3. CSU1656: Paper of FlyBrother(后缀数组)

    Description FlyBrother is a superman, therefore he is always busy saving the world.  To graduate fro ...

  4. js实现点击不同的按钮后各自返回被点击的次数

    js实现点击不同的按钮后各自返回被点击的次数 一.总结 1.注意:返回的不是三个按钮总的点击数,而是每一个的 2.用全局变量的话每一个按钮要多一个函数,用闭包就很方便 二.js实现点击不同的按钮后各自 ...

  5. 利用VS安装项目打包软件的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 昨天摸索了一下,发现使用VS安装项目来打包软件还是挺方便的. 1. 创建一个安装项目工程,如下图: 2. 设置工程属性 ...

  6. 【u230】回文词

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] CR喜欢研究回文词,有天他发现一篇文章,里面有很多回文数,这使他来了兴趣.他决定找出所有长度在n个字节 ...

  7. swift学习第十三天:类的构造函数

    类的构造函数 构造函数的介绍 构造函数类似于OC中的初始化方法:init方法 默认情况下载创建一个类时,必然会调用一个构造函数 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数. 如果是继 ...

  8. showSoftInput不起作用

    et_add_share_content.postDelayed(new Runnable() {   @Override public void run() { InputMethodManager ...

  9. mybatis逆向工程随笔

    mybatis框架简介和简单原理: mybatis本来是apache的一个开源的项目,后来迁移到了google,并且改名为mybatis. mybatis框架优点: 1.mybatis是最简单的持久化 ...

  10. Qt5 编译 & 打包依赖dll发布

    十年前学C++的时候,无聊到把windows 文件夹下几乎所有的*.dll 都看过一遍.偶尔在程序运行时看到缺少 *.dll 的提示,都会直接找出来解决. 随着“开发平台”和“编译器”版本的逐年升级, ...