当前位置: 首页 > news >正文

搜索二叉树的操作与实现(c Java)

07_二叉搜索树

二叉搜索树又叫二叉排序树,二叉查找树。

7.1 定义

在二叉树的基础上,增加了几个规则约束(左小右大):

  • 如果它的左子树不空,则左子树上所有的值均小于它的根节点的值
  • 若它的右子树不空,则右子树上所有的值均大于它的根节点的值
  • 它的左、右树又分为二叉排序树

7.2 申明

c 实现:

typedefintElement_t;//定义节点结构typedefstructtreenode{Element_t data;structtreenode*left;structtreenode*right;}TreeNode_t;//定义二叉搜索树结构typedefstruct{intcount;TreeNode_t*root;}BinarySearchTree_t;

Java 实现:

Element:

packagecom.Sonnet.Element;publicclassElement{privateintdata;publicElement(){}publicElement(intdata){this.data=data;}@OverridepublicStringtoString(){returnString.valueOf(this.data);}@OverridepublicinthashCode(){returnInteger.hashCode(this.data);}@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(this.getClass()!=obj.getClass())returnfalse;Elementother=(Element)obj;returnthis.data==((Element)obj).data;}publicintgetData(){returndata;}}

TreeNode:

packagecom.Sonnet.BinarySearchTree;importcom.Sonnet.Element.Element;publicclassTreeNode{privateElementdata;privateTreeNodeleft;privateTreeNoderight;publicTreeNode(){};publicTreeNode(Elementdata){this.data=data;this.left=null;this.right=null;}}

BinarySearchTree:

packagecom.Sonnet.BinarySearchTree;publicclassBinarySearchTree{privateTreeNoderoot;privateintcount;}

7.3 创建

c 实现:

/*创建树*/BinarySearchTree_t*createBinarySearchTree(){BinarySearchTree_t*tree=malloc(sizeof(BinarySearchTree_t));if(tree==NULL){printf("malloc failed\n");returnNULL;}//初始化tree->count=0;tree->root=NULL;returntree;}

Java 实现:

publicBinarySearchTree(){this.root=null;this.count=0;}

7.4 插入

7.4.1 递归

c 实现:

/*创建节点*/staticTreeNode_t*createTreeNode(Element_t data){TreeNode_t*node=malloc(sizeof(TreeNode_t));if(node==NULL){printf("malloc failed\n");returnNULL;}//初始化node->data=data;node->left=NULL;node->right=NULL;returnnode;}/*插入节点*/staticTreeNode_t*insertNode(BinarySearchTree_t*tree,TreeNode_t*node,Element_t data){if(node==NULL){tree->count++;returncreateTreeNode(data);}if(data<node->data){node->left=insertNode(tree,node->left,data);}elseif(data>node->data){node->right=insertNode(tree,node->right,data);}returnnode;}/*递归插入*/voidinsertTreeNodeRecur(BinarySearchTree_t*tree,Element_t data){if(tree==NULL)return;tree->root=insertNode(tree,tree->root,data);}

Java 实现:

/*插入节点*/privateTreeNodeinsertNode(TreeNodenode,Elementdata){if(node==null){this.count++;returnnewTreeNode(data);}if(data.getData()<node.getData().getData()){node.setLeft(insertNode(node.getLeft(),data));}elseif(data.getData()>node.getData().getData()){node.setRight(insertNode(node.getRight(),data));}returnnode;}/* 功能: 递归插入 参数: 节点数据 返回值: 无 */publicvoidinsertTreeNodeRecur(Elementdata){this.root=insertNode(this.root,data);}

7.4.2 非递归

c 实现:

/*插入节点非递归*/voidinsertTreeNodeNoRecur(BinarySearchTree_t*tree,Element_t data){if(tree==NULL)return;//辅助指针TreeNode_t*pre=NULL;TreeNode_t*cur=tree->root;while(cur){pre=cur;if(data<cur->data){cur=cur->left;}elseif(data>cur->data){cur=cur->right;}//如果相等就直接返回else{return;}}//创建节点TreeNode_t*node=createTreeNode(data);if(pre){if(data<pre->data){pre->left=node;}else{pre->right=node;}}//当根节点不存在时,pre和cur都为空else{tree->root=node;}tree->count++;}

Java 实现:

/* 功能:非递归插入节点 参数:节点数据 返回值:无 */publicvoidinsertTreeNodeNoRecur(Elementdata){//辅助指针TreeNodepre=null;TreeNodecur=this.root;while(cur!=null){pre=cur;if(data.getData()<cur.getData().getData()){cur=cur.getLeft();}elseif(data.getData()>cur.getData().getData()){cur=cur.getRight();//相等直接返回}else{return;}}//创建节点TreeNodenode=newTreeNode(data);if(pre!=null){if(data.getData()<pre.getData().getData()){pre.setLeft(node);}else{pre.setRight(node);}//当根节点为空时,pre和cur都为空}else{this.root=node;}this.count++;}

7.5 访问节点数据

c 实现:

/*访问节点数据*/voidvisitTreeNode(TreeNode_t*node){if(node){printf("%d\t",node->data);}}

Java 实现:

publicvoidvisitTreeNode(TreeNodenode){if(node==null)return;System.out.print(node.getData()+"\t");}

7.6 释放

c 实现:

/*释放节点*/staticvoidreleaseTreeNode(BinarySearchTree_t*tree,TreeNode_t*node){if(node==NULL)return;releaseTreeNode(tree,node->left);releaseTreeNode(tree,node->right);free(node);tree->count--;}/*释放*/voidreleaseBinarySearchTree(BinarySearchTree_t*tree){releaseTreeNode(tree,tree->root);printf("tree have %d node\n",tree->count);free(tree);}

Java 实现:

/*释放节点*/privatevoidreleaseTreeNode(TreeNodenode){if(node==null){return;}releaseTreeNode(node.getLeft());releaseTreeNode(node.getRight());node.setLeft(null);node.setRight(null);this.count--;}/* 功能: 释放二叉搜索树 参数: 无 返回值: 无 */publicvoidreleaseBinarySearchTree(){releaseTreeNode(this.root);this.root=null;System.out.println("this tree have "+this.count+" node");}

7.7 中序遍历

c 实现:

/*中序遍历节点*/staticvoidinOrderTreeNode(TreeNode_t*node){if(node==NULL)return;inOrderTreeNode(node->left);visitTreeNode(node);inOrderTreeNode(node->right);}/*中序遍历*/voidinOrderBinarySearchTree(BinarySearchTree_t*tree){inOrderTreeNode(tree->root);printf("\n");}

Java 实现:

/*中序遍历节点*/privatevoidinOrderTreeNode(TreeNodenode){if(node==null)return;this.inOrderTreeNode(node.getLeft());this.visitTreeNode(node);this.inOrderTreeNode(node.getRight());}/* 功能: 中序遍历 参数: 无 返回值: 无 */publicvoidinOrderBinarySearchTree(){inOrderTreeNode(this.root);System.out.println();}

7.8 获取高度

c 实现:

/*高度*/intheightBinarySearchTree(TreeNode_t*node){if(node==NULL)return0;intrightHeight=heightBinarySearchTree(node->right);intleftHeight=heightBinarySearchTree(node->left);if(leftHeight>rightHeight){return++leftHeight;}else{return++rightHeight;}}

Java 实现:

/* 功能: 获取二叉搜索树高度 参数: 根节点 返回值: 高度 */publicintheightBinarySearchTree(TreeNoderoot){if(root==null)return0;intleftHeight=this.heightBinarySearchTree(root.getLeft());intrightHeight=this.heightBinarySearchTree(root.getRight());if(leftHeight>rightHeight){return++leftHeight;}else{return++rightHeight;}}

7.9 搜索

c 实现:

/*搜索*/TreeNode_t*searchTreeNode(BinarySearchTree_t*tree,Element_t data){TreeNode_t*node=tree->root;while(node){if(data<node->data){node=node->left;}elseif(data>node->data){node=node->right;}elsereturnnode;}returnNULL;}

Java 实现:

/* 功能: 搜索节点 参数: 数据 返回值: 节点 */publicTreeNodesearchTreeNode(Elementdata){TreeNodenode=this.root;while(node!=null){if(data.getData()<node.getData().getData()){node=node.getLeft();}elseif(data.getData()>node.getData().getData()){node=node.getRight();}else{returnnode;}}returnnull;}

e"> Java 实现:

/* 功能: 搜索节点 参数: 数据 返回值: 节点 */publicTreeNodesearchTreeNode(Elementdata){TreeNodenode=this.root;while(node!=null){if(data.getData()<node.getData().getData()){node=node.getLeft();}elseif(data.getData()>node.getData().getData()){node=node.getRight();}else{returnnode;}}returnnull;}
http://www.jsqmd.com/news/335761/

相关文章:

  • 京东家政全国百城招募20万人 免费培训打造家政职业化人才
  • 2月1日面试题整理
  • C++:智能指针完全指南(原理、用法与避坑实战,从 RAII 到循环引用)
  • 2026年口碑好的上海胶辊厂家专业度参考(精选) - 行业平台推荐
  • Linux操作系统之线程:线程互斥
  • 2026年口碑好的海绵胶辊行业内知名厂家推荐 - 行业平台推荐
  • 2026年2月GEO优化公司权威榜:技术和营销能力TOP5深度测评
  • 销冠一走,客户全跑?2026年,你的销售团队该彻底换种活法了!
  • CAXA编程方案覆盖全工艺类型
  • 从步态分析到康复医学:青瞳视觉(CHINGMU)如何用高精度动捕解读人体“运动密码”
  • <span class=“js_title_inner“>SolarWinds 修复四个严重漏洞,可导致未认证RCE和认证绕过</span>
  • 2026年驻马店复合肥厂家综合评测与选型指南 - 2026年企业推荐榜
  • 2026年比较好的面板式流量计/塑料转子流量计厂家怎么选 - 行业平台推荐
  • AI原生应用中的上下文理解:常见误区与解决方案
  • Step-Audio-R1:语音模态的Scaling Law
  • 把你的MCP Server部署到公网,让阿里云上的应用来访问和使用
  • AI培训海外就业机构实测对比:3家主流机构深度测评,避坑指南+理性选择建议 - 短商
  • 基于SpringBoot+Vue的和餐饮管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 2026年口碑好的高精度流量计量仪表厂家用户好评推荐 - 行业平台推荐
  • 基于SpringBoot+Vue的spring boot疫情信息管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 驻马店农资选购指南:如何甄别真正专业的化肥与农资服务商? - 2026年企业推荐榜
  • 深入研究大数据领域 Hadoop 的 Oozie 工作流调度系统
  • 2026年温州优质激光笔厂商甄选指南与深度评测 - 2026年企业推荐榜
  • 武昌区优质英语教学辅导班盘点与选择建议 - 2026年企业推荐榜
  • 武汉东湖高新区幼儿英语辅导班选择指南与机构推荐 - 2026年企业推荐榜
  • IDEA 报错 TS7016: Could not find a declaration file for module xxxx
  • <span class=“js_title_inner“>《Docker极简教程》--Docker网络--Docker网络的配置和使用</span>
  • 2026年质量好的流量计量仪表/面板式流量计量仪表厂家实力与用户口碑参考 - 行业平台推荐
  • Orthogonal Subspace Decomposition for Generalizable AI-Generated ImageDetection
  • 基于SpringBoot+Vue的智慧校园之家长子系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】