博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法与数据结构 (二) 二叉树的简单实现,非递归的前序遍历 中序遍历 后序遍历...
阅读量:5011 次
发布时间:2019-06-12

本文共 4442 字,大约阅读时间需要 14 分钟。

一 前言

树是一种逻辑结构,物理实现有连续存储方式(数组)和非连续的链表方式。最常见的是二叉树,连续存储就是按照层次遍历的方法,依次存入数组,但空的节点也必须存储,也就是说会造成空间的浪费 ,所以只适用于满二叉树和完全二叉树。

树的遍历方法 有两类,一类是深度遍历:

前序遍历:就是先遍历当前节点,再遍历左子树,最后遍历右子树   中左右  对于下图  80 55 32 60 90 96 98

中序遍历:对应的就是  左中右   32 55 60 80 90 96 98

后序遍历: 左右中       32 60 55 98 96 90 80

另一类是层次遍历 

就是按层访问  80  55 90 32 60 96 98

 

 对于第一类深度优先,是一个递归的过程,所以用递归的算法很容易。而非递归在于自己手动创建栈,实现递归过程。

二 代码实现

二叉树的遍历首先是要有一棵树,在漫画算法里有一个基于链表创建二叉树的例子。见代码:(另外要用数组描述二叉树,有两种方式,一是给出中序遍历和其它先(后)序遍历,或者就是带空节点的遍历方法 比如上图的遍历就是

{80, 55, 32, null, null, 60, null, null, 90, null, 96,null,98,null,null}

 下面的算法就是基于这样的链表实现二叉树的创建的

 

package tree;import java.util.*;public class MyTree {    int val;    MyTree left;    MyTree right;    MyTree() {    }    MyTree(int val) {        this.val = val;    }  //二叉树结构定义//根据链表创建二叉树    public static MyTree createTree(LinkedList
list) { if (list == null || list.size() == 0) return null; Integer data = list.removeFirst(); MyTree node = null; if (data != null) { node = new MyTree(data); node.left = createTree(list); node.right = createTree(list); } return node; }//前序遍历的递归版本 public static void xianXu(MyTree tree) { if (tree == null) return; System.out.print(tree.val + " "); xianXu(tree.left); xianXu(tree.right); }//中序遍历的递归版本 public static void zhongXu(MyTree tree) { if (tree == null) return; zhongXu(tree.left); System.out.print(tree.val + " "); zhongXu(tree.right); }//后序遍历的递归版本 public static void houXu(MyTree tree) { if (tree == null) return; houXu(tree.left); houXu(tree.right); System.out.print(tree.val + " "); }//先序遍历的非递归版本 public static void xianXu1(MyTree tree) { if (tree == null) return; Deque
deque = new ArrayDeque<>(); MyTree node = null; deque.push(tree); while (!deque.isEmpty()) { node = deque.pop(); System.out.print(node.val + " "); if (node.right != null) deque.push(node.right); if (node.left != null) deque.push(node.left); } }//中序遍历的非递归版本 public static void zhongXu1(MyTree tree) { if (tree == null) { return; } MyTree now = tree; Deque
deque = new ArrayDeque<>(); while (!deque.isEmpty() || now != null) { while (now != null) { deque.push(now); now = now.left; } now = deque.pop(); System.out.print(now.val + " "); now = now.right; } }//后序遍历的非递归版本 public static void houXu1(MyTree tree) { if (tree == null) return; Deque
deque = new ArrayDeque<>(); Deque
deque1 = new ArrayDeque<>(); MyTree node = null; deque.push(tree); while (!deque.isEmpty()) { node = deque.pop(); deque1.push(node.val); if (node.left != null) deque.push(node.left); if (node.right != null) deque.push(node.right); } while (!deque1.isEmpty()) System.out.print(deque1.pop() + " "); }//层次遍历 public static void cengCi(MyTree tree) { if (tree == null) return; Queue
queue = new ArrayDeque<>(); MyTree now = null; queue.offer(tree); while (!queue.isEmpty()) { now = queue.poll(); System.out.print(now.val + " "); if (now.left != null) queue.offer(now.left); if (now.right != null) queue.offer(now.right); } }}

 

  下面是测试代码:

public class TreeTest {    public static void main(String[] args) {        Integer[] arr = {80, 55, 32, null, null, 60, null, null, 90, null, 96,null,98,null,null};        MyTree tree=MyTree.createTree(new LinkedList<>(Arrays.asList(arr)));        MyTree.xianXu(tree);        System.out.println("前序递归");        MyTree.xianXu1(tree);        System.out.println("前序非递归");        MyTree.zhongXu(tree);        System.out.println("中序递归");        MyTree.zhongXu1(tree);        System.out.println("中序非递归");        MyTree.houXu(tree);        System.out.println("后序递归");        MyTree.houXu1(tree);        System.out.println("后序非递归");        MyTree.cengCi(tree);        System.out.println("层次遍历");    }}

  

 

转载于:https://www.cnblogs.com/caijiwdq/p/11024890.html

你可能感兴趣的文章
log
查看>>
663 如何做“低端”产品?(如何把低端做得高端 - 认同感)
查看>>
JDBC 第九课 —— 初次接触 JUnit
查看>>
Windows核心编程:第10章 同步设备IO与异步设备IO
查看>>
浏览器加载、解析、渲染的过程
查看>>
开放api接口签名验证
查看>>
sed 常用操作纪实
查看>>
C++复习:对C的拓展
查看>>
校外实习报告(九)
查看>>
android之android.intent.category.DEFAULT的用途和使用
查看>>
CAGradientLayer 透明渐变注意地方(原创)
查看>>
织梦DEDE多选项筛选_联动筛选功能的实现_二次开发
查看>>
iOS关于RunLoop和Timer
查看>>
SQL处理层次型数据的策略对比:Adjacency list vs. nested sets: MySQL【转载】
查看>>
已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
查看>>
MySQL的随机数函数rand()的使用技巧
查看>>
thymeleaf+bootstrap,onclick传参实现模态框中遇到的错误
查看>>
python字符串实战
查看>>
wyh的物品(二分)
查看>>
12: xlrd 处理Excel文件
查看>>