二叉树遍历(Java实现)
二叉树遍历(Java实现)
主要是二叉树的遍历,包括递归遍历和非递归遍历
- import java.util.ArrayDeque;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Queue;
- public class BinaryNode<T> {
- /**
- * 泛型BinaryNode类
- */
- public T item;
- public BinaryNode<T> left,right;//左右子树
- public BinaryNode(T item)
- {
- this.item = item;
- left = right = null;
- }
- public BinaryNode (T item, BinaryNode<T> left, BinaryNode<T> right)
- {
- this.item = item;
- this.left = left;
- this.right = right;
- }
- public T getNodeValue() {
- return item;
- }
- public void setNodeValue(T item) {
- this.item = item;
- }
- public BinaryNode<T> getLeft() {
- return left;
- }
- public void setLeft(BinaryNode<T> left) {
- this.left = left;
- }
- public BinaryNode<T> getRight() {
- return right;
- }
- public void setRight(BinaryNode<T> right) {
- this.right = right;
- }
- //判断是否为叶子
- public boolean isLeaf(){
- return (left==null)&&(right==null);
- }
- //前序遍历二叉树(递归)
- public List<BinaryNode<T>> toStringPreorder(BinaryNode<T> node){
- List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
- list.add(node);
- if (node.left!=null) {
- list.addAll(toStringPreorder(node.left));
- }
- if (node.right!=null) {
- list.addAll(toStringPreorder(node.right));
- }
- return list;
- }
- //前序遍历二叉树(非递归)
- public List<BinaryNode<T>> toStringPreorderNoRec(BinaryNode<T> node){
- List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
- ArrayDeque<BinaryNode<T>> stack=new ArrayDeque<BinaryNode<T>>();
- while ((node!=null)||!stack.isEmpty()) {
- if (node!=null) {
- list.add(node);
- stack.push(node);
- node=node.left;
- } else {
- node=stack.peek();
- stack.pop();
- node=node.right;
- }
- }
- return list;
- }
- //中序遍历二叉树
- public List<BinaryNode<T>> toStringInorder(BinaryNode<T> node){
- List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
- if (node.left!=null) {
- list.addAll(toStringPreorder(node.left));
- }
- list.add(node);
- if (node.right!=null) {
- list.addAll(toStringPreorder(node.right));
- }
- return list;
- }
- //中序遍历二叉树(非递归)
- public List<BinaryNode<T>> toStringInorderNoRec(BinaryNode<T> node){
- List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
- ArrayDeque<BinaryNode<T>> stack=new ArrayDeque<BinaryNode<T>>();
- while ((node!=null)||!stack.isEmpty()) {
- if (node!=null) {
- stack.push(node);
- node=node.left;
- } else {
- node=stack.peek();
- list.add(node);
- stack.pop();
- node=node.right;
- }
- }
- return list;
- }
- //后序遍历二叉树
- public String toStringPostorder(){
- String result="";
- if (left!=null) {
- result += left.toStringPostorder();
- }
- if (right!=null) {
- result += right.toStringPostorder();
- }
- result += item;
- return result;
- }
- //后序遍历二叉树(非递归)
- /**
- * 先遍历树的逆后序遍历(根、右、左),在翻转逆后序遍历就是后序遍历二叉树(左、右、根)
- * @return result栈
- */
- public ArrayDeque<BinaryNode<T>> toStringPostorderNoRec(BinaryNode<T> node){
- ArrayDeque<BinaryNode<T>> stack=new ArrayDeque<BinaryNode<T>>();
- ArrayDeque<BinaryNode<T>> result=new ArrayDeque<BinaryNode<T>>();
- while ((node!=null)||!stack.isEmpty()) {
- if (node!=null) {
- result.push(node);
- stack.push(node);
- node=node.right;
- } else {
- node=stack.peek();
- stack.pop();
- node=node.left;
- }
- }
- return result;
- }
- //后序遍历二叉树2(非递归)
- /**
- * 要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;
- * 或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,
- * 则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
- * @return result栈
- */
- public ArrayList<BinaryNode<T>> toStringPostorderNoRec2(BinaryNode<T> root){
- ArrayDeque<BinaryNode<T>> stack=new ArrayDeque<BinaryNode<T>>();
- ArrayList<BinaryNode<T>> result=new ArrayList<BinaryNode<T>>();
- BinaryNode<T> curr;//当前栈顶指针
- BinaryNode<T> pre=null;//前一次访问节点
- stack.push(root);
- while (!stack.isEmpty()) {
- curr=stack.peek();
- if ((curr.left==null&&curr.right==null)||(pre!=null&&(pre==curr.left||pre==curr.right))) {
- result.add(curr);//输出结果
- stack.pop();
- pre=curr;
- } else {
- if (curr.right!=null) {
- stack.push(curr.right);
- }
- if (curr.left!=null) {
- stack.push(curr.left);
- }
- }
- }
- return result;
- }
- //层序遍历(广度优先遍历)
- public List<BinaryNode<T>> toStringLevelOrder(){
- List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
- Queue<BinaryNode<T>> queue=new ArrayDeque<BinaryNode<T>>();
- queue.offer(this);//root
- while (!(queue.isEmpty())) {
- list.add(queue.peek());
- BinaryNode<T> node=queue.poll();
- if (node.left != null) {
- queue.offer(node.left);
- }
- if (node.right != null) {
- queue.offer(node.right);
- }
- }
- return list;
- }
- }
二叉树遍历(Java实现)的更多相关文章
- 二叉树遍历-JAVA实现
二叉树遍历分为前序.中序.后序递归和非递归遍历.还有层序遍历. //二叉树节点 public class BinaryTreeNode { private int data; private Bina ...
- 二叉树遍历Java实现
[仅贴代码及测试结果] -------------------BinaryTree.java------------------------------ class Tree<E>{ E ...
- 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历
根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...
- 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离
数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...
- java 二叉树遍历
package com.lever; import java.util.LinkedList;import java.util.Queue; /** * 二叉树遍历 * @author lckxxy ...
- java数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
- 【数据结构】之二叉树的java实现
转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...
- 二分法与二叉树的 Java 实现
算法与数据结构始终是计算机基础的重要一环,今天我们来讨论下 Java 中二叉树的实现以及一些简单的小算法,如二分查找,归并排序等. 二分查找 二分查找是一种在有序数组中查找某一特定元素的搜索算法,它在 ...
- 二叉树的Java实现及特点总结
二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树: ...
随机推荐
- keil 系列问题
1.为了让keil支持stm32f0系列,安装了keil4更高级的版本,但是发现编译时弹出异常提示框,经过一番折腾后找到解决办法,首先把电脑登陆账户名改为非中文的,然后卸载了keil重装就可以了. ...
- C#利用WebClient 两种方式下载文件(一)
WebClient client = new WebClient(); 第一种 string URLAddress = @"http://files.cnblogs.com/x4646/tr ...
- 【转】Nginx跳转任意Http请求到Https
网站买了证书,绿条,多霸气! 那么自然得拦截http的访问方式了. 拦截http,301到https 各种Google,最后在Nginx官网找到例子,配置很简单,如下: server { listen ...
- Win10 耳机无声音,扬声器有声音的解决办法
注:适用于WIN10及WIN10.ubuntu双系统耳机无声音的问题. 在WIN10的引导下,安装了Ubuntu的桌面版,作成了双系统,可是发现了一个问题:进入Win10后插耳机会没有声音,扬声器有声 ...
- [Asp.Net] web api 部署注意事项
在将web api项目部署到IIS上的时候 要将应用程序池设置成.net framework 4.0版本
- SAP成都研究院非典型程序猿,菜园子小哥:当我用UI5诊断工具时我用些什么
身边有些年轻同事曾经向我表达过这种困扰:尽管完成日常工作没有任何问题,但是还想更进一步,把代码写得更好些,做到精益求精.现在写的代码能实现功能,但是不知道可以怎样写得更好. 除了阅读优秀的开源库开源框 ...
- SAP成都研究院C4C光明左使:SAP Cloud for Customer 使用SAP UI5的独特之处
大家好,今天的文章来自我的同事,Yang Joey. 2017年7月,SAP成都研究院C4C开发团队刚刚建立.某个周一早晨的Scrum meeting,新出现一位眉清目秀的小伙子,向大家自我介绍:&q ...
- FETCH - 用游标从查询中抓取行
SYNOPSIS FETCH [ direction { FROM | IN } ] cursorname where direction can be empty or one of: NEXT P ...
- python_58_装饰器1
装饰器:定义:本质是函数,(装饰其他函数),就是为其它函数添加附加功能原则:1.不能修改被饰的函数的源代码 2.不能修改被饰的函数的调用方式实现装饰器知识储备: 1.函数即“变量” 2.高阶函数 3. ...
- Javascript显示提示信息加样式
#region JS提示============================================ /// <summary> /// 添加编辑删除提示 /// </s ...