数据结构JAVA编程求教#includestdio.h /* EOF(=^Z或F6),NULL */
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
#define N 9 /* 数据元素个数 */
typedef char KeyType; /* 设关键字域为字符型 */
typedef struct /* 数据元素类型 */
{
KeyType key;
int weight;
}ElemType;
ElemType r[N]={{'A',1},{'B',1},{'C',2},{'D',5},{'E',3},
{'F',4},{'G',4},{'H',3},{'I',5}}; /* 数据元素(以教科书例9-1为例),全局变量 */
int sw[N 1]; /* 累计权值,全局变量 */
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)(b))
typedef struct
{
ElemType *elem; /* 数据元素存储空间基址,建表时按实际长度分配,0号单元留空 */
int length; /* 表长度 */
}SSTable;
Status Creat_Seq(SSTable *ST,int n)
{ /* 操作结果: 构造一个含n个数据元素的静态顺序查找表ST(数据来自全局数组r) */
int i;
(*ST).elem=(ElemType *)calloc(n 1,sizeof(ElemType)); /* 动态生成n个数据元素空间(0号单元不用) */
if(!(*ST).elem)
return ERROR;
for(i=1;i=n;i)
*((*ST).elem i)=r[i-1]; /* 将全局数组r的值依次赋给ST */
(*ST).length=n;
return OK;
}
void Ascend(SSTable *ST)
{ /* 重建静态查找表为按关键字非降序排序 */
int i,j,k;
for(i=1;i(*ST).length;i)
{
k=i;
(*ST).elem[0]=(*ST).elem[i]; /* 待比较值存[0]单元 */
for(j=i 1;j=(*ST).length;j)
if LT((*ST).elem[j].key,(*ST).elem[0].key)
{
k=j;
(*ST).elem[0]=(*ST).elem[j];
}
if(k!=i) /* 有更小的值则交换 */
{
(*ST).elem[k]=(*ST).elem[i];
(*ST).elem[i]=(*ST).elem[0];
}
}
}
Status Creat_Ord(SSTable *ST,int n)
{ /* 操作结果: 构造一个含n个数据元素的静态按关键字非降序查找表ST */
/* 数据来自全局数组r */
Status f;
f=Creat_Seq(ST,n);
if(f)
Ascend(ST);
return f;
}
Status Traverse(SSTable ST,void(*Visit)(ElemType))
{ /* 初始条件: 静态查找表ST存在 , Visit()是对元素操作的应用函数 */
/* 操作结果: 按顺序对ST的每个元素调用函数Visit()一次且仅一次 。*/
/* 一旦Visit()失败,则操作失败 */
ElemType *p;
int i;
p=ST.elem; /* p指向第一个元素 */
for(i=1;i=ST.length;i)
Visit(*p);
return OK;
}
typedef ElemType TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
Status SecondOptimal(BiTree *T, ElemType R[],int sw[],int low,int high)
{ /* 由有序表R[low..high]及其累计权值表sw(其中sw[0]==0)递归构造 */
/* 次优查找树T 。*/
int i,j;
double min,dw;
i=low;
min=fabs(sw[high]-sw[low]);
dw=sw[high] sw[low-1];
for(j=low 1;j=high;j) /* 选择最小的△Pi值 */
if(fabs(dw-sw[j]-sw[j-1])min)
{
i=j;
min=fabs(dw-sw[j]-sw[j-1]);
}
*T=(BiTree)malloc(sizeof(BiTNode));
if(!*T)
return ERROR;
(*T)-data=https://www.04ip.com/post/R[i]; /* 生成结点 */
if(i==low)
(*T)-lchild=NULL; /* 左子树空 */
else
SecondOptimal((*T)-lchild,R,sw,low,i-1); /* 构造左子树 */
if(i==high)
(*T)-rchild=NULL; /* 右子树空 */
else
SecondOptimal((*T)-rchild,R,sw,i 1,high); /* 构造右子树 */
return OK;
}
void FindSW(int sw[],SSTable ST)
{ /* 按照有序表ST中各数据元素的Weight域求累计权值表sw */
int i;
sw[0]=0;
for(i=1;i=ST.length;i)
sw[i]=sw[i-1] ST.elem[i].weight;
}
typedef BiTree SOSTree; /* 次优查找树采用二叉链表的存储结构 */
Status CreateSOSTree(SOSTree *T,SSTable ST)
{ /* 由有序表ST构造一棵次优查找树T 。ST的数据元素含有权域weight 。*/
【查找树的java代码 java编写查找功能的具体代码】 if(ST.length==0)
*T=NULL;
else
{
FindSW(sw,ST); /* 按照有序表ST中各数据元素的Weight域求累计权值表sw */
SecondOptimal(T,ST.elem,sw,1,ST.length);
}
return OK;
}
Status Search_SOSTree(SOSTree *T,KeyType key)
{ /* 在次优查找树T中查找关键字等于key的元素 。找到则返回OK,否则返回FALSE */
while(*T) /* T非空 */
if((*T)-data.key==key)
return OK;
else if((*T)-data.keykey)
*T=(*T)-lchild;
else
*T=(*T)-rchild;
return FALSE; /* 顺序表中不存在待查元素 */
}
void print(ElemType c) /* Traverse()调用的函数 */
{
printf("(%c %d) ",c.key,c.weight);
}
void main()
{
SSTable st;
SOSTree t;
Status i;
KeyType s;
Creat_Ord(st,N); /* 由全局数组产生非降序静态查找表st */
Traverse(st,print);
CreateSOSTree(t,st); /* 由有序表构造一棵次优查找树 */
printf("\n请输入待查找的字符: ");
scanf("%c",s);
i=Search_SOSTree(t,s);
if(i)
printf("%c的权值是%d\n",s,t-data.weight);
else
printf("表中不存在此字符\n");
}
运行结果:
这个是数据结构上的一个源码,你用这个自己改一改试试吧
建立一个二叉树,附带查询代码,JAVA代码import java.util.ArrayList;
// 树查找树的java代码的一个节点
class TreeNode {
Object _value = https://www.04ip.com/post/null; // 查找树的java代码他的值
TreeNode _parent = null; // 他的父节点查找树的java代码 , 根节点没有PARENT
ArrayList _childList = new ArrayList(); // 他的孩子节点
public TreeNode( Object value, TreeNode parent ){
this._parent = parent;
this._value = https://www.04ip.com/post/value;
}
public TreeNode getParent(){
return _parent;
}
public String toString() {
return _value.toString();
}
}
public class Tree {
// 给出宽度优先遍历的值数组,构建出一棵多叉树
// null 值表示一个层次的结束
// "|" 表示一个层次中一个父亲节点的孩子输入结束
// 如:给定下面的值数组:
// { "root", null, "left", "right", null }
// 则构建出一个根节点 , 带有两个孩子("left","right")的树
public Tree( Object[] values ){
// 创建根
_root = new TreeNode( values[0], null );
// 创建下面的子节点
TreeNode currentParent = _root; // 用于待创建节点的父亲
//TreeNode nextParent = null;
int currentChildIndex = 0; // 表示 currentParent 是他的父亲的第几个儿子
//TreeNode lastNode = null; // 最后一个创建出来的TreeNode,用于找到他的父亲
for ( int i = 2; ivalues.length; i){
// 如果null ,表示下一个节点的父亲是当前节点的父亲的第一个孩子节点
if ( values[i] == null ){
currentParent = (TreeNode)currentParent._childList.get(0);
currentChildIndex = 0;
continue;
}
// 表示一个父节点的所有孩子输入完毕
if ( values[i].equals("|") ){
if ( currentChildIndex 1currentParent._childList.size() ){
currentChildIndex;
currentParent = (TreeNode)currentParent._parent._childList.get(currentChildIndex);
}
continue;
}
TreeNode child = createChildNode( currentParent, values[i] );
}
}
TreeNode _root = null;
public TreeNode getRoot(){
return _root;
}
/**
// 按宽度优先遍历,打印出parent子树所有的节点
private void printSteps( TreeNode parent, int currentDepth ){
for ( int i = 0; iparent._childList.size(); i){
TreeNode child = (TreeNode)parent._childList.get(i);
System.out.println(currentDepth ":" child);
}
if ( parent._childList.size() != 0 )System.out.println("" null);// 为了避免叶子节点也会打印null
//打印 parent 同层的节点的孩子
if ( parent._parent != null ){ // 不是root
int i = 1;
while ( iparent._parent._childList.size() ){// parent 的父亲还有孩子
TreeNode current = (TreeNode)parent._parent._childList.get(i);
printSteps( current, currentDepth );
i;
}
}
// 递归调用,打印所有节点
for ( int i = 0; iparent._childList.size(); i){
TreeNode child = (TreeNode)parent._childList.get(i);
printSteps( child, currentDepth 1 );
}
}
// 按宽度优先遍历,打印出parent子树所有的节点
public void printSteps(){
System.out.println("" _root);
System.out.println("" null);
printSteps(_root, 1 );
}**/
// 将给定的值做为 parent 的孩子,构建节点
private TreeNode createChildNode( TreeNode parent, Object value ){
TreeNode child = new TreeNode( value , parent );
parent._childList.add( child );
return child;
}
public static void main(String[] args) {
Tree tree = new Tree( new Object[]{ "root", null,
"left", "right", null,
"l1","l2","l3", "|", "r1","r2",null } );
//tree.printSteps();
System.out.println(""( (TreeNode)tree.getRoot()._childList.get(0) )._childList.get(0) );
System.out.println(""( (TreeNode)tree.getRoot()._childList.get(0) )._childList.get(1) );
System.out.println(""( (TreeNode)tree.getRoot()._childList.get(0) )._childList.get(2) );
System.out.println(""( (TreeNode)tree.getRoot()._childList.get(1) )._childList.get(0) );
System.out.println(""( (TreeNode)tree.getRoot()._childList.get(1) )._childList.get(1) );
}
}
java:二叉树添加和查询方法
package arrays.myArray;
public class BinaryTree {
private Node root;
// 添加数据
public void add(int data) {
// 递归调用
if (null == root)
root = new Node(data, null, null);
else
addTree(root, data);
}
private void addTree(Node rootNode, int data) {
// 添加到左边
if (rootNode.datadata) {
if (rootNode.left == null)
rootNode.left = new Node(data, null, null);
else
addTree(rootNode.left, data);
} else {
// 添加到右边
if (rootNode.right == null)
rootNode.right = new Node(data, null, null);
else
addTree(rootNode.right, data);
}
}
// 查询数据
public void show() {
showTree(root);
}
private void showTree(Node node) {
if (node.left != null) {
showTree(node.left);
}
System.out.println(node.data);
if (node.right != null) {
showTree(node.right);
}
}
}
class Node {
int data;
Node left;
Node right;
public Node(int data, Node left, Node right) {
this.data = https://www.04ip.com/post/data;
this.left = left;
this.right = right;
}
}
JAVA数据结构关于查找树的节点的代码分析你好,递归调用简单的说就是自己无限的调用自己的下一级,也就是说父节点和子节点拥有相同的属性和方法,所以在处理玩当前节点也就是父节点的时候,就调用处理自身下面的子节点 , 类似于文件夹和文件,文件夹相对于当前目录来说是父节点,而他里面的子文件夹就相当于子节点,但是处理子文件夹的时候,子文件夹就成了父节点,一次递归处理完毕
希望可以帮助到你
java数据结构二叉树查找结点操作,递归调用求详细讲解这是先序遍历树的代码,什么是先序遍历呢,一种按照根-左子树-右子树的顺序遍历树就是先序遍历 。
CBTType TreeFindNode(CBTType treeNode,String data){
CBTType ptr;
if(treeNode==null){//输入根节点为空时
return null;
}else{
if(treeNode.data.equals(data)){//根节点等于要查找的数据时
return treeNode;
}else{
if((ptr=TreeFindNode(treeNode.left,data))!=null){//从左子树查找,为什么可以用TreeFindNode表示呢?
return ptr;
}else if((ptr=TreeFindNode(treeNode.right,data))!=null){//从右子树查找
return ptr;
}else{
return null;
}
}
}
}
从左子树查找,为什么可以用TreeFindNode表示呢?因为,左子树也可以按照先序遍历的顺序查找的 , 所以当然可以用TreeFindNode表示,如果你想左子树用中序遍历查找,那么就不可以用TreeFindNode表示 。
上述例子的查找过程:
1 --根(2,4,5)--左(3,6 , 7)--右
2--根(4)--左(5)--右
4--根
5--根
返回
关于查找树的java代码和java编写查找功能的具体代码的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- b站怎么玩手游直播,在b站怎么直播手游
- 蜂助手注册稿公众号设计,蜂助手地址
- 游戏桌面怎么找不到微信,找不到微信游戏设置
- flutter转跳并且销毁当前页面,flutter quill
- gets函数的使用c语言的简单介绍
- linux上传文件夹命令,ftp上传整个文件夹命令
- 怎么删除战地5的硬盘,怎么删除战地5的硬盘文件
- h版电影迅雷下载,大赢家电影迅雷下载
- java怎么做mysql java创建mysql数据库