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递归查找层级文件夹下特定内容的文件
递归查找文件 引言 或许是文件太多,想找某个文件又忘记放哪了;又或者是项目改造,需要将外部调用接口进行改造,项目太多,又无法排查.那么怎么快速找到自己想要的内容就是一件值得思考的事情了. 根据特定内容 ...
随机推荐
- 【例题3-1 UVA - 272 】TEX Quotes
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 大水题. 用一个int记录遇到的是左括号还是右括号. [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] #inc ...
- GCD 初步学习
GCD应该是比較牛逼的东西了吧,一时半会应该是操作不好. 在cocoa-china上面有两篇关于GCD的文章.GCD 深入理解(一) GCD 深入理解(二) CSDN荣芳志博客:点击打开链接 我仅仅是 ...
- iOS进阶路线以及进阶书籍
第一,熟悉ARC机制:首先要了解ARC的前世今生.假设了解不清楚会导致两种可能,1,一个对象的引用莫名奇异为空.或失效了.这个一般都能在开发阶段及时发现,由于会导致应用异常.2.导致内存溢出:不了解A ...
- 看朋友日志发现的一个ios下block相关的内存管理问题,非常奇怪,请大家帮忙一起来回答!
http://blog.csdn.net/fengsh998/article/details/38090205 这篇文章以下是我的回复.相同的代码仅仅是把变量的定义从局部变量改为类的成员变量就发现了非 ...
- ZOJ Special AC String 水
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3702 题目大意: 对于给定的一个字符串,满足如下要求输出AC,否则WA(好吧我 ...
- https://github.com/zhangxianyi/Source-Insight-Plugin
https://github.com/zhangxianyi/Source-Insight-Plugin
- Java 8新特性探究(十一)Base64详解
开发十年,就只剩下这套架构体系了! >>> BASE64 编码是一种常用的字符编码,在很多地方都会用到.但base64不是安全领域下的加密解密算法.能起到安全作用的效果很差,而且 ...
- Ajax请求Session超时的解决办法:拦截器 + 封装jquery的post方法
目标:前端系统,后端系统等,统一处理Session超时和系统错误的问题. 可能需要处理的问题:Session超时.系统500错误.普通的业务错误.权限不足. 同步请求: Sess ...
- 利用PS把多张psd格式的图片转换为一张PDF格式
最近为公司做了一版电子样册,所有图片都是包含多图层高清晰的psd格式,要做成一个PDF文件的电子样册,发给客户看,面对这些零散的图片,本来打算利用在线合成:在线网址 https://smallpdf. ...
- 【t047】网络
Time Limit: 1 second Memory Limit: 128 MB [问题描述] Bessie受雇来到John的农场帮他们建立internet网络.农场有 N (2<= N &l ...