二叉树
时间:2019-11-01
本文章向大家介绍二叉树,主要包括二叉树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
二叉树:树的每个节点最多只能有两个子节点
上图的第一幅图B节点有DEF三个子节点,就不是二叉树,称为多路树;而第二幅图每个节点最多只有两个节点,是二叉树,并且二叉树的子节点称为“左子节点”和“右子节点”。上图的D,E分别是B的左子节点和右子节点。
如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉搜索树(binary search tree)的特殊二叉树。
二叉搜索树要求:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
/** * hash * @param key * @return */ private static <k> int getHashCode(k key){ int h; //生成的hash值的随机性会增大 return (h = key.hashCode()) ^ (h >>> 16); } Node root; class Node <k,v>{ private k key; private v value; private int hasKey; //节点数据 private Node leftChild; //左子节点的引用 private Node rightChild; //右子节点的引用 private int isDelete = 0; //是否删除 public Node(int hasKey,k key,v value){ this.hasKey = hasKey; this.key = key; this.value = value; } } /** * 查找节点 * @param key * @return */ public Node find(Object key){ int hashKey = getHashCode(key); if (root==null){ return root; } Node curr = root; while (curr!=null){ if (curr.hasKey==hashKey){ return curr; }else if (curr.hasKey>hashKey){ curr = curr.leftChild; }else { curr = curr.rightChild; } } return null; } /** * 插入新节点 * @param key * @param value * @return */ public Node insert(Object key,Object value){ int hashKey = getHashCode(key); Node newNode = new Node(hashKey,key,value); if (root==null){ root = newNode; return newNode; } Node curr = root; while (curr!=null){ Node parentNode = curr; if (curr.hasKey>hashKey){ curr = curr.leftChild; if (curr==null){ parentNode.leftChild = newNode; } }else { curr = curr.rightChild; if (curr==null){ parentNode.rightChild = newNode; } } } return newNode; } /** * 删除节点 * @param key * @return Node */ public Node delete(int key){ int hashKey = getHashCode(key); Node curr = root; while (curr!=null){ if (curr.hasKey==hashKey){ curr.isDelete=1; return curr; }else if (curr.hasKey>hashKey){ curr = curr.leftChild; }else { curr = curr.rightChild; } } return null; }
原文地址:https://www.cnblogs.com/wushenghfut/p/11776142.html
- Android解析ClassLoader(一)Java中的ClassLoader
- Android学习笔记(一)之仿正点闹钟时间齿轮滑动的效果
- Android解析WindowManager(三)Window的添加过程
- Spring Cloud构建微服务架构:服务消费(Ribbon)【Dalston版】
- Android解析WindowManager(一)WindowManager体系
- ios9 http请求失败的问题
- Android内存优化(六)LeakCanary使用详解
- Spring Cloud构建微服务架构:服务消费(Feign)【Dalston版】
- React Native组件(四)TextInput组件解析
- struts2实现ajax校验的2种方法
- 单例对象
- Android+struts2+json方式模拟手机登录功能
- iOS 获取通讯录里边的电话号码AddressBook
- InvocationTargetException异常解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Educational Codeforces Round 81 (Rated for Div. 2) A. Display The Number
- Cypress系列(55)- 设置全局 URL
- Linux不同共享库中同名函数的处理
- Cypress系列(56)- 避免访问多个站点
- Cypress系列(57)- 删除等待代码
- DOM 又是个什么鬼?
- Cypress系列(58)- 停用条件测试
- 会python真的可以为所欲为——爆破前端加密登录
- XML 出来接客了!
- Cypress系列(59)- 实时调试和中断
- Python基础实战之猜年龄游戏
- 你以为 Servlet 过时了?
- 简述 Tomcat
- Python网络爬虫(实践篇)
- Python网络爬虫(浏览器伪装技术)