java非递归遍历树_java二叉树的非递归遍历

二叉树的递归遍历比较简单,这里就不聊了。今天主要聊聊二叉树的非递归遍历,主要借助于“栈”后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历。

1. 先看看节点类型:

//二叉树的节点类型

private class Node{

int data; //节点值

Node leftChild; //左孩子

Node rightChild; //右孩子

public Node(int data) {

this.data=data;

}

}

2.先序遍历。

非递归先序遍历的思路如下:

1.先将根节点入栈

2.访问根节点

3.如果根节点存在右孩子,则将右孩子入栈

4.如果根节点存在左孩子,则将左孩子入栈(注意:一定是右孩子先入栈,然后左孩子入栈)

5.重复2-4

public void preOrder(Node Root) {

if(Root==null) {

System.out.println("空树");

return;

}

Node tmp=Root;

Stack s=new Stack();

s.push(tmp); //根节点入栈

while(!s.empty()) {

//1.访问根节点

Node p=s.pop();

System.out.print(p.data+" ");

//2.如果根节点存在右孩子,则将右孩子入栈

if(p.rightChild!=null) {

s.push(p.rightChild);

}

//3.如果根节点存在左孩子,则将左孩子入栈

if(p.leftChild!=null) {

s.push(p.leftChild);

}

}

System.out.println();

}

3.中序遍历。

非递归中序遍历的思路如下:

1.先将根节点入栈

2.将当前节点的所有左孩子入栈,直到左孩子为空

3.访问栈顶元素,如果栈顶元素存在右孩子,则继续第2步

4.重复第2、3步,直到栈为空并且所有的节点都被访问

public void inOrder(Node Root) {

if(Root==null) {

System.out.println("空树");

return;

}

Node tmp=Root;

Stack s=new Stack();

while(tmp!=null || !s.empty()) {

//1.将根节点入栈

//2.将所有左孩子入栈

while(tmp!=null) {

s.push(tmp);

tmp=tmp.leftChild;

}

//3.访问栈顶元素

tmp=s.pop();

System.out.print(tmp.data+" ");

//4.如果栈顶元素存在右孩子,则将右孩子赋值给tmp,也就是将右孩子入栈

if(tmp.rightChild!=null) {

tmp=tmp.rightChild;

}

//否则,将tmp置为null,表示下次要访问的是栈顶元素

else {

tmp=null;

}

}

System.out.println();

}

4.后序遍历。

后续遍历的非递归实现思路:

1.根节点入栈

2.将根节点的左子树入栈,直到最左,没有左孩子为止

3.得到栈顶元素的值,先不访问,判断栈顶元素是否存在右孩子,如果存在并且没有被访问,则将右孩子入栈,否则,就访问栈顶元素

public void postOrder(Node Root) {

if(Root==null) {

System.out.println("空树");

return;

}

Node tmp=Root; //当前节点

Node prev=null; //上一次访问的节点

Stack s=new Stack();

while(tmp!=null || !s.empty()) {

//1.将根节点及其左孩子入栈

while(tmp!=null) {

s.push(tmp);

tmp=tmp.leftChild;

}

if(!s.empty()) {

//2.获取栈顶元素值

tmp=s.peek();

//3.没有右孩子,或者右孩子已经被访问过

if(tmp.rightChild==null || tmp.rightChild==prev) {

//则可以访问栈顶元素

tmp=s.pop();

System.out.print(tmp.data+" ");

//标记上一次访问的节点

prev=tmp;

tmp=null;

}

//4.存在没有被访问的右孩子

else {

tmp=tmp.rightChild;

}

}

}

System.out.println();

}

利用非递归算法来搜索二叉树中的某个元素java

层序遍历

可以利用层序遍历来解决这个问题

代码

boolean searchUsingLevelOrder(BinaryTreeNode root,int data){

BinaryTreeNode temp;

LLQueue q = new LLQueue();

if(root == null)

return false;

q.enqueue(root);

while(q.isNotEmpty()){

temp = q.deQueue();

if(data == root.getData())

return true;

if(temp.getLeft() != null)

q.enqueue(temp.getLeft());

if(temp.getRight() != null)

q.enqueue(temp.getRight());

}

q.deleteQueue();

return false;

}

Java递归、非递归实现二叉树遍历

最近找工作做笔试题发现很重要,就自己写了一点,和大家分享

import java.util.Stack;

import java.util.HashMap;

public class BinTree {

private char date;

private BinTree lchild;

private BinTree rchild;

public BinTree(char c) {

date = c;

}

// 先序遍历递归

public static void preOrder(BinTree t) {

if (t == null) {

return;

}

System.out.print(t.date);

preOrder(t.lchild);

preOrder(t.rchild);

}

// 中序遍历递归

public static void InOrder(BinTree t) {

if (t == null) {

return;

}

InOrder(t.lchild);

System.out.print(t.date);

InOrder(t.rchild);

}

// 后序遍历递归

public static void PostOrder(BinTree t) {

if (t == null) {

return;

}

PostOrder(t.lchild);

PostOrder(t.rchild);

System.out.print(t.date);

}

// 先序遍历非递归

public static void preOrder2(BinTree t) {

Stack s = new Stack();

while (t != null || !s.empty()) {

while (t != null) {

System.out.print(t.date);

s.push(t);

t = t.lchild;

}

if (!s.empty()) {

t = s.pop();

t = t.rchild;

}

}

}

// 中序遍历非递归

public static void InOrder2(BinTree t) {

Stack s = new Stack();

while (t != null || !s.empty()) {

while (t != null) {

s.push(t);

t = t.lchild;

}

if (!s.empty()) {

t = s.pop();

System.out.print(t.date);

t = t.rchild;

}

}

}

// 后序遍历非递归

public static void PostOrder2(BinTree t) {

Stack s = new Stack();

Stack s2 = new Stack();

Integer i = new Integer(1);

while (t != null || !s.empty()) {

while (t != null) {

s.push(t);

s2.push(new Integer(0));

t = t.lchild;

}

while (!s.empty() && s2.peek().equals(i)) {

s2.pop();

System.out.print(s.pop().date);

}

if (!s.empty()) {

s2.pop();

s2.push(new Integer(1));

t = s.peek();

t = t.rchild;

}

}

}

public static void main(String[] args) {

BinTree b1 = new BinTree('a');

BinTree b2 = new BinTree('b');

BinTree b3 = new BinTree('c');

BinTree b4 = new BinTree('d');

BinTree b5 = new BinTree('e');

/**

* a

* / /

* b c

* / /

* d e

*/

b1.lchild = b2;

b1.rchild = b3;

b2.lchild = b4;

b2.rchild = b5;

BinTree.preOrder(b1);

System.out.println();

BinTree.preOrder2(b1);

System.out.println();

BinTree.InOrder(b1);

System.out.println();

BinTree.InOrder2(b1);

System.out.println();

BinTree.PostOrder(b1);

System.out.println();

BinTree.PostOrder2(b1);

}

}

到此这篇关于java二叉树的非递归遍历的文章就介绍到这了,更多相关java二叉树内容请搜索聚米学院以前的文章或继续浏览下面的相关文章希望大家以后多多支持聚米学院!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
Java二叉树非递归遍历可以通过使用栈数据结构来实现。首先,我们创建一个空的栈,将根节点入栈。然后,我们进入一个循环,直到栈为空为止。在每一次循环中,我们弹出栈顶元素,并将其访问。接下来,如果该节点有右子节点,则将右子节点入栈。如果该节点有左子节点,则将左子节点入栈。由于栈是先进后出的数据结构,所以我们先入栈右子节点,再入栈左子节点,以确保在遍历过程中先访问左子节点。这样就能够实现二叉树非递归遍历。 以下是一个示例代码实现二叉树非递归中序遍历: ```java public void inorderTraversal(Node root) { if (root == null) { return; } Stack<Node> stack = new Stack<>(); Node current = root; while (current != null || !stack.isEmpty()) { while (current != null) { stack.push(current); current = current.leftChild; } current = stack.pop(); System.out.print(current.data + " "); // 访问节点 current = current.rightChild; } } ``` 在这个示例代码中,我们首先判断当前节点是否为空或者栈是否为空,如果不满足则进入循环。在循环内部,我们首先将当前节点及其所有左子节点入栈,直到当前节点为空。然后,我们弹出栈顶节点并访问该节点。最后,将当前节点更新为其右子节点,并继续下一次循环。 通过这种方式,我们可以实现二叉树非递归中序遍历。你可以根据需要修改代码实现其他类型的非递归遍历,比如前序遍历和后序遍历。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [用Python实现二叉树二叉树非递归遍历及绘制的例子](https://download.csdn.net/download/weixin_38618784/14869891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [java实现二叉树非递归遍历](https://blog.csdn.net/weixin_41826973/article/details/105555647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值