数据结构之关于树的操作(JAVA实现)(三)
来源:互联网 发布:快手段子制作软件 编辑:程序博客网 时间:2024/06/09 15:16
树的基本结构
public class TreeNode<T>{public TreeNode<T> leftNode;public TreeNode<T> rightNode;public T data;public TreeNode(T data){this.data = data;}}1.构建一颗树(本文以表达式树为例,用后缀表达式构建,我在前一篇已近介绍了如何将中序转换为后续表达式)
原理:利用栈。步骤:a.当前字符为字符或者数字,则直接构建一个节点,然后入栈
b.当前字符为操作符,则在栈中取出两个节点,将这两个节点作为孩子节点构建一棵树入栈
c.最后将栈中剩下的唯一节点返回,就是要构建的树
// 构建一颗字符树,即数学表达式public static TreeNode<Character> getTree(String obj){// TreeNode<Character> node2=new TreeNode<Character>(null);Stack<TreeNode<Character>> stack = new Stack<TreeNode<Character>>();for (int i = 0; i < obj.length(); i++){char temp = obj.charAt(i);if (Character.isLetterOrDigit(temp))// 如果是字母或者数字,那么直接构建一个树,入栈{TreeNode<Character> node = new TreeNode<Character>(temp);stack.push(node);} else// 操作符的话,从栈中取出两个树节点,然后合并成一个节点,操作符为根节点{TreeNode<Character> node = new TreeNode<Character>(temp);// 有操作符,栈至少有两个元素node.rightNode = stack.pop();node.leftNode = stack.pop();stack.push(node);}}return stack.pop();}2.用先序,中序,后序打印一颗树,这个没有什么好说的
/* * 递归 打印一棵树 先序,中序,后序 */// 先序遍历一棵树,(根左右)public String printTreePreOreder(TreeNode<T> node){String obj = "";if (node != null){obj += node.data;obj += printTreePreOreder(node.leftNode);obj += printTreePreOreder(node.rightNode);}return obj;}// 中序遍历一棵树(左根右)public String printTreeInfixOreder(TreeNode<T> node){String obj = "";if (node != null){if (node.leftNode != null)obj += "(";obj += printTreeInfixOreder(node.leftNode);obj += node.data;obj += printTreeInfixOreder(node.rightNode);if (node.rightNode != null)obj += ")";}return obj;}// 后续遍历一棵树(左右根)public String printTreePostOreder(TreeNode<T> node){String obj = "";if (node != null){obj += printTreePostOreder(node.leftNode);obj += printTreePostOreder(node.rightNode);obj += node.data;}return obj;}3.得到树的高度(使用递归)
原理:树根的高度=最大的孩子的高度+1
// 得到一棵树额高度public int getHeight(){if(this==null)return 0;if (this.leftNode == null && this.rightNode == null)return 1;int lHeight = this.leftNode.getHeight();int rHeight = this.rightNode.getHeight();return lHeight > rHeight ? lHeight + 1 : rHeight + 1;}4.打印树的第k层(递归实现)
原理:可以理解为打印根的第k层,即打印根的孩子的第k-1层,当k=0时,可以直接打印出来
// 打印一棵树的第level层public void printTreeAtLevel(TreeNode<T> node, int level){if (node == null || level < 0)return;if (level == 0)// 到达目标层System.out.print(node.data);printTreeAtLevel(node.leftNode, level - 1);print(1);///打印一个空格printTreeAtLevel(node.rightNode, level - 1);}
5.按层次打印一棵树
我实现了两种方法:
方法一:
知道了树的高度,依次打印出各层的高度。但是这种方法,会在打印任何一层的时候都会从根节点开始,浪费时间
// 按照树的格式打印一棵树,必须按层次打印public void printTree(){int height = getHeight();for (int i = 0; i < height; i++){print(height * 2 - i);printTreeAtLevel(this, i);System.out.println();}}方法二:
用两个队列实现,队列1保存所有的同一层叶节点,队列2保存保存队列1的正在访问的孩子节点 ,队列1访问完以后,将队列2加到队列1(此时是空队列)中,再讲队列2清空
public void printTreeByQueue(TreeNode<T> root){Queue<TreeNode<T>> queue1, queue2;queue1 = new LinkedList<TreeNode<T>>();queue2 = new LinkedList<TreeNode<T>>();queue1.add(root);queue2.add(root);while (!queue2.isEmpty()){queue2.clear();while (!queue1.isEmpty()){TreeNode<T> node = queue1.poll();print(2);System.out.print(node.data);if (node.leftNode != null)queue2.add(node.leftNode);if (node.rightNode != null)queue2.add(node.rightNode);}queue1.addAll(queue2);System.out.println();}}
2 0
- 数据结构之关于树的操作(JAVA实现)(三)
- Java 数据结构之数组的操作三:实现各种排序方法
- 数据结构与算法之三(栈和队列的java实现)
- 数据结构之队列的实现(JAVA)
- 关于java二叉树数据结构的实现
- Java关于数据结构的实现:树
- Java关于数据结构的实现:树
- 数据结构之关于树的操作(树的递归和非递归遍历)-(四补)
- 数据结构之关于树的操作(树的递归和非递归遍历)-(四补)
- 数据结构之链表的增删操作的Java实现
- 数据结构之java实现链式队列(三)
- java数据结构之实现 二叉树 以及二叉树的遍历方式(三)
- 数据结构面试之五—二叉树的常见操作(递归实现部分)
- 数据结构面试之五—二叉树的常见操作(递归实现部分)
- 数据结构之红黑树(三)——删除操作
- 数据结构之红黑树(三)——删除操作
- 数据结构之红黑树(三)——删除操作
- 【数据结构】之二叉树的java实现
- oracle exp 用法实例
- 个人稀疏编码笔记
- Java虚拟机类加载和执行机制
- 类加载器 在加载类时可能会对类内的方法内代码顺序做优化
- Twitter算法面试题详解(Java实现)
- 数据结构之关于树的操作(JAVA实现)(三)
- Android应用入口
- Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果
- Today is end today is beginning.
- 一道腾讯面试题的思考:到底谁会赢?
- git命令
- laravel路由
- 加班与效率
- listview控件属性详解