线索二叉树(中序) Java实现
来源:互联网 发布:可以打鼓的软件 编辑:程序博客网 时间:2024/06/06 08:40
代码所示为下图二叉树
中序遍历:CBDAEF
C,D,F有两个空指针域,E有一个
步骤如下:
1.创建二叉树
2.创建头结点
3.中序遍历线索化
4.中序遍历此线索二叉树(非递归方式)
public class ThreadedBinaryTree {private static String [] array = {"A","B","C","","","D","","","E","","F","",""};private static int arrayIndex = 0;/** * 全局node,始终指向刚刚访问过的结点 */private static ThreadedBinaryNode preNode;/** * 1.参考创建二叉树,前序遍历输入 */public static ThreadedBinaryNode createThreadedBinaryTree(){String data = "";if(arrayIndex<array.length){data = array[arrayIndex];arrayIndex++;}ThreadedBinaryNode node = null;//data为空表示没有这个孩子if(data==null||data.equals("")){return node;}else{node = new ThreadedBinaryNode(data);node.setLchild(createThreadedBinaryTree());node.setRchild(createThreadedBinaryTree());node.setLtag(PointerTag.LINK);node.setRtag(PointerTag.LINK);return node;}}/** * 2.创建头结点,左孩子指向根节点 * @param rootNode */public static ThreadedBinaryNode createHeadNode(ThreadedBinaryNode rootNode){ThreadedBinaryNode headNode = new ThreadedBinaryNode();headNode.setLtag(PointerTag.LINK);headNode.setRtag(PointerTag.THREAD);//右孩子先指向自己,如果根节点不为null,指向中序遍历的最后一个结点,为null不用变headNode.setRchild(headNode);if(rootNode != null){//根结点不为null,头结点的左孩子指向根结点headNode.setLchild(rootNode);preNode = headNode;//开始中序遍历根结点inOrderTraverse(rootNode);//中序遍历的最后一个结点的后继指向头结点preNode.setRtag(PointerTag.THREAD);preNode.setRchild(headNode);//头结点的右孩子指向最后一个结点headNode.setRchild(preNode);}else{//根节点为null 左孩子指向自己headNode.setLchild(headNode);}return headNode;}/** * 3.中序遍历线索化 */public static void inOrderTraverse(ThreadedBinaryNode node){if(node != null){//递归左孩子线索化inOrderTraverse(node.getLchild());//结点处理if(null == node.getLchild()){//如果左孩子为空,设置tag为线索 THREAD,并把lchild指向刚刚访问的结点node.setLtag(PointerTag.THREAD);node.setLchild(preNode);}if(null == preNode.getRchild()){//如果preNode的右孩子为空,设置tag为线索THREADpreNode.setRtag(PointerTag.THREAD);preNode.setRchild(node);}//此处和前后两个递归的顺序不能改变,和结点处理同属一个级别preNode = node;//System.out.print(node.getData());//递归右孩子线索化inOrderTraverse(node.getRchild());}}/** * 4.中序遍历 非递归方式 * @param headNode */public static void inOrderTraverseNotRecursion(ThreadedBinaryNode headNode){ThreadedBinaryNode node = headNode.getLchild();while(headNode != node){//最左while(node.getLtag() == PointerTag.LINK){node = node.getLchild();}System.out.print(node.getData());//根while(node.getRtag() == PointerTag.THREAD && node.getRchild() !=headNode){node = node.getRchild();System.out.print(node.getData());}//右,不能打印是因为该子树下可能还存在最左node = node.getRchild();}}public static void main(String[] args) {//创建二叉树,约定前序输入ThreadedBinaryNode rootNode = createThreadedBinaryTree();//创建头结点,并中序遍历线索化ThreadedBinaryNode headNode = createHeadNode(rootNode);//中序遍历 非递归方式输出inOrderTraverseNotRecursion(headNode);}}class ThreadedBinaryNode{private String data;private ThreadedBinaryNode lchild;private ThreadedBinaryNode rchild;private PointerTag ltag;private PointerTag rtag;public String getData() {return data;}public void setData(String data) {this.data = data;}public ThreadedBinaryNode getLchild() {return lchild;}public void setLchild(ThreadedBinaryNode lchild) {this.lchild = lchild;}public ThreadedBinaryNode getRchild() {return rchild;}public void setRchild(ThreadedBinaryNode rchild) {this.rchild = rchild;}public PointerTag getLtag() {return ltag;}public void setLtag(PointerTag ltag) {this.ltag = ltag;}public PointerTag getRtag() {return rtag;}public void setRtag(PointerTag rtag) {this.rtag = rtag;}public ThreadedBinaryNode(String data) {super();this.data = data;}public ThreadedBinaryNode() {super();}@Overridepublic String toString() {return "ThreadedBinaryNode [data=" + data + ", ltag=" + ltag+ ", rtag=" + rtag + "]";}}/** * LINK :表示指向左右孩子的指针 * THREAD:表示指向前驱后继的线索 * @author cmdsm * */enum PointerTag{LINK , THREAD}
0 0
- 中序线索二叉树Java实现
- 线索二叉树(中序) Java实现
- 中序线索二叉树(Java)
- 中序线索二叉树的实现
- 实现中序线索化二叉树
- 中序线索二叉树的实现
- C++实现中序线索二叉树
- Java实现线索二叉树
- 线索二叉树原理及前序、中序线索化(Java版)
- 线索二叉树(中序索引)
- 线索化二叉树(中序)
- 线索(中序)二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- AR 开发资料汇总
- 类似Build Error: #513: a value of type "int" cannot be assigned to an entity of type "char *"
- 用composer在laravel框架下安装极光时遇到的问题
- H5 知识点
- 清除webBrowser 缓存和Cookie的解决方案
- 线索二叉树(中序) Java实现
- JS处理各种JSON类型数据
- 使用Atmel Studio编程Arduino Uno开发板
- 欢迎使用CSDN-markdown编辑器
- 如何用MindManager辅助5W2H分析法
- safari浏览器实现模拟click点击事件
- 关于百度地图设置显示的比例尺大小
- redis连接池工具类
- TDateTime类使用