写了个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. autohotkey word getfullname (ComObjActive)

    直接使用ComObjActive

  2. UIActionSheet上加入UIPickerView iOS8替换方案

    此套替换方案採用"UIView+动画"方式实现(将UIActionSheet替换为UIView) 界面层级例如以下: 第一层:view(这一层充满整个屏幕,初始化时颜色为透明.us ...

  3. Nginx系列(二)--模块化

    高度模块化的设计设Nginx架构的基础. 在Nginx中,除了少量的核心代码,其它一切皆为模块.模块化设计具有下面特点: 1.高度抽象的模块接口 2.灵活性 3.配置模块的设计使Nginx提供了高可配 ...

  4. TCP套接字编程模型及实例

    摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...

  5. stm32的timer

  6. PDFObject.js、jquerymedia.js、pdf.js的对比

    由于在做手机项目中需要用到预览pdf文件的需求,一搜还真多,试用后发现兼容性不是很好,大多需要浏览器对pdf阅读的支持: 如果你只是想不依赖浏览器本身对pdf解析的情况下,在手机展示pdf文件,就需要 ...

  7. SetForegroundWindow

    SetForegroundWindow 函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口.键盘输入转向该窗口,并为用户改各种可视的记号.系统给创建前台窗口的线程分配的权限稍高于其他线程. ...

  8. [TypeStyle] Use fallback values in TypeStyle for better browser support

    You can increase the browser support of your CSS using fallback values and vendor prefixes. This les ...

  9. 【JAVA编码专题】UNICODE,GBK,UTF-8区别 分类: B1_JAVA 2015-02-10 21:07 153人阅读 评论(0) 收藏

    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与g ...

  10. thinkphp5 tp5 获取模块名控制器名方法名

    <?php namespace app\index\controller; use think\Db; use think\Controller; class Base extends Cont ...