二叉树的遍历--用递归 和栈 实现 前序、中序、后序遍历
来源:互联网 发布:台北房价知多少 编辑:程序博客网 时间:2024/05/20 04:29
import java.util.HashMap;import java.util.Map;import java.util.Stack;/** * 作者:用递归 和栈 实现 前序、中序、后序遍历 * 功能说明: */public class BinarayTree { Node<String> root; /** * 构造器 * @param data */ public BinarayTree(String data) { super(); root=new Node<String>(data, null, null); } /** * 栈+循环 实现 后序遍历 * @param root * 思路 后序遍历不同于先序和中序,它是要先处理完左右子树,然后再处理根(回溯),所以需要一个记录哪些节点已经被访问的结构(可以在树结构里面加一个标记),这里可以用map实现 */ public void postOrderTraverse2(Node root){ if(root==null)return; Stack<Node<String>> stack=new Stack<>(); Map<Node<String>,Boolean> map=new HashMap<Node<String>,Boolean>(); stack.push(root); while(!stack.isEmpty()){ Node temp=stack.peek(); //peek 返回栈顶的值,但不移出栈 (pop移出栈) if(temp.leftChild!=null && !map.containsKey(temp.leftChild)){ temp=temp.leftChild; while(temp!=null){ if(map.containsKey(temp)){ break; } else{ stack.push(temp); } temp=temp.leftChild; } continue; } if(temp.rightChild!=null&&!map.containsKey(temp.rightChild)){ stack.push(temp.rightChild); continue; } Node t=stack.pop(); map.put(t,true); System.out.print(" : "+t.data); } } /** * 栈+循环 实现 前序遍历 * @param root * 思路 只要栈里面有元素 就轮循 */ public void preOrderTraverse2(Node root){ if(root ==null){ return; } Stack<Node<String>> stack=new Stack<>(); stack.push(root); while (!stack.isEmpty()) { Node<String> curNode= stack.pop();//栈顶元素出站 System.out.print(" : "+curNode.data);//有坑 注意非空判断 if(curNode.rightChild!=null){ stack.push(curNode.rightChild); } if(curNode.leftChild!=null){ stack.push(curNode.leftChild);; } } } /** * 栈+循环 实现 中序遍历 * @param root * 思路 左子树都处理完直到null的时候出栈并访问。 */ public void mirOrderTraverse2(Node root){ if(root ==null){ return; } Stack<Node<String>> stack=new Stack<>(); while(root!=null || !stack.isEmpty()){ while(root!=null){ stack.push(root);//先访问再入栈 root=root.leftChild; } root=stack.pop(); //出栈 System.out.print(" : "+root.data); root=root.rightChild;//如果是null,出栈并处理右子树 } } /** * 递归算法 前序遍历 * @param root */ public void preOrderTraverse1(Node root){ if(root ==null){ return; } System.out.print(" : "+root.data); preOrderTraverse1(root.leftChild); preOrderTraverse1(root.rightChild); } /** * 递归算法 中序遍历 * @param root */ public void mirOrderTraverse1(Node root){ if(root==null){ return; } mirOrderTraverse1(root.leftChild); System.out.print (" : "+root.data); mirOrderTraverse1(root.rightChild); } /** * 递归算法 后序遍历 * @param root */ public void postOrderTraverse1(Node root){ if(root==null){ return; } postOrderTraverse1(root.leftChild); postOrderTraverse1(root.rightChild); System.out.print(" : "+root.data); } /** * 定义类 * @version 创建时间: 2017-11-14 下午10:26:07 * 类说明: */ public class Node<T>{ T data; Node leftChild; Node rightChild; public Node(T data, Node leftChild, Node rightChild) { super(); this.data = data; this.leftChild = leftChild; this.rightChild = rightChild; } }
/** * 构建二叉树 * A * B C * D E F */ public void createTree(){ Node<String> nodeB =new Node<String>("B", null, null); Node<String> nodeC =new Node<String>("C", null, null); Node<String> nodeD =new Node<String>("D", null, null); Node<String> nodeE =new Node<String>("E", null, null); Node<String> nodeF =new Node<String>("F", null, null); root.leftChild=nodeB; root.rightChild=nodeC; nodeB.leftChild=nodeD; nodeB.rightChild=nodeE; nodeC.rightChild=nodeF; } public static void main(String[] args) { BinarayTree tree=new BinarayTree("A");//传递的是根节点的值 tree.createTree(); System.out.println("递归 前序遍历:正确顺序值 A B D E C F"); tree.preOrderTraverse1(tree.root); System.out.println(); System.out.println("栈+循环 前序遍历:正确顺序值 A B D E C F"); tree.preOrderTraverse2(tree.root); System.out.println(); System.out.println("------------------------------"); System.out.println("递归 中序遍历:正确顺序值 D B E A C F"); tree.mirOrderTraverse1(tree.root); System.out.println(); System.out.println("栈+循环 中序遍历:正确顺序值D E B F C A"); tree.mirOrderTraverse2(tree.root); System.out.println(); System.out.println("------------------------------"); System.out.println("递归 后序遍历:正确顺序值 D E B F C A"); tree.postOrderTraverse1(tree.root); System.out.println(); System.out.println("栈+循环 后序遍历:正确顺序值D E B F C A"); tree.postOrderTraverse2(tree.root); }}
运行结果如下:
阅读全文
0 0
- 二叉树的遍历--用递归 和栈 实现 前序、中序、后序遍历
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 【二叉树】 前序、中序和后序的递归遍历与非递归遍历
- 二叉树的遍历 前序 中序 后序 分别实现递归和非递归遍历方式
- 二叉树非递归前、中、后序遍历实现
- 【数据结构】二叉树结点插入和前序、中序、后序遍历的递归实现
- 二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
- java 实现二叉树深度优先遍历的 前、中、后序遍历(递归)
- 二叉树的非递归【前/中/后 序遍历】
- 用java实现二叉树非递归的前序,中序,后序遍历算法
- 二叉树 前序遍历的非递归实现 中序遍历的非递归实现 后序遍历的非递归实现 创建二叉树
- 前序和中序重建二叉树, 树的前序递归,中序递归,后序递归遍历和前序非递归,中序非递归,后序非递归遍历
- 【二叉树】实现二叉树的前序、中序、后序的非递归遍历
- 二叉树的前序、中序、后序遍历 递归非递归实现
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 二叉树的前序,中序,后序遍历(递归非递归实现)
- 实现二叉树的前序/中序/后序递归、非递归遍历
- 如何将一个Maven项目转化成一个Eclipse项目
- Anniversary party (树形dp)
- Eclipse强制关闭导致无法再次启动的解决方法
- Http中Get与Post的区别
- hdu 1000 java代码
- 二叉树的遍历--用递归 和栈 实现 前序、中序、后序遍历
- R语言实现LDA主题模型分析知乎话题
- js中的BOM对象
- 慕课网HTML+CSS基础课程学习
- 开源代码应用之Eclipse篇
- webpack 处理图片
- 个人总结35
- eclipse导入web项目时报错
- 微信开放平台之公众号第三方平台开发及全网发布验证