数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
来源:互联网 发布:大数据调研报告 银行 编辑:程序博客网 时间:2024/05/16 20:31
package test;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Stack;public class BinaryTree { /** * 用内部类申明结点结构 * */ class Node{ int value = 0; Node lchild = null; Node rchild = null; Node(int value){ this.value = value; } } /** * 先序创建二叉树 * i为数组下标 */ static int i = 0; Node createTree(int[] input) { Node node= null; if(input[i]<0) return node; node = new Node(input[i]); i++; node.lchild = createTree( input); i++; node.rchild = createTree(input); return node; } /** * 递归方式实现先序遍历 * @param root * @param result */ void preOrder(Node root,ArrayList<Node> result){ if(root == null) return ; result.add(root); preOrder(root.lchild,result); preOrder(root.rchild,result); } /** * 递归方式实现中序遍历 * @param root * @param result */ void midOrder(Node root,ArrayList<Node> result) { if(root == null) return ; midOrder(root.lchild, result); result.add(root); midOrder(root.rchild, result); } /** * 递归方式实现后序遍历 * @param root * @param result */ void postOrder(Node root,ArrayList<Node> result) { if(root == null) return ; postOrder(root.lchild,result); postOrder(root.rchild,result); result.add(root); } /** * 迭代方式实现先序遍历。 * 因为递归就是用到栈的原理,所以所有递归式子都可以用栈来表示,遍历一定用到了栈。 * 1.根入栈 * 2.栈顶元素出栈,右结点入栈,左节点入栈。循环该步骤 * @param root * @return */ ArrayList<Node> preOrder(Node root) { Stack<Node> stack = new Stack<Node>(); ArrayList<Node> list = new ArrayList<Node>(); if(root == null) { return list; } stack.push(root); while(!stack.isEmpty()) { Node node = stack.pop(); list.add(node); if(node.rchild!= null) stack.push(node.rchild); if(node.lchild!=null) stack.push(node.lchild); } return list; } /** * 迭代方式实现中序遍历。 * 先将所有左节点压栈,左节点为空时,说明已经到了该树枝的尽头,则栈顶元素出栈,再去遍历该结点的右子树 * @param root * @return */ ArrayList<Node> midOrder(Node root){ ArrayList<Node> list = new ArrayList<Node>(); Stack<Node> stack = new Stack<Node>(); Node node = root; if(root == null) return list; while(!stack.isEmpty() || node!=null) { while(node!=null) { stack.push(node); node = node.lchild; } node = stack.pop(); list.add(node); node = node.rchild; } return list; } /** * 迭代实现后序遍历。 * 两个重要的变量:刚刚打印完的结点print和栈顶结点top(即将要打印的结点),初始值print为根节点,top为null * 1.先判断栈顶结点的左子树是否被遍历,遍历原理是:判断print是否为栈顶节点的左孩子或者右孩子结点 * 2.再判断栈顶结点的右子树是否被遍历,遍历原理是:判断print是否为栈顶节点的右孩子结点 * 3.若左右子树都被遍历了,则栈顶结点出栈,打印该该节点。 * 找到top和print结点的关系 * @param root * @return */ ArrayList<Node> postOrder(Node root){ ArrayList<Node> list = new ArrayList<>(); Stack<Node> stack = new Stack<>(); Node top = null; Node print = root; stack.push(root); while(!stack.isEmpty()) { //先获取栈顶元素,为了判断栈顶元素是否可以被打印,要执行后面的判断语句 top = stack.peek(); //判断栈顶元素的左子树是否被打印了 if(top.lchild!= null && top.lchild != print && top.rchild !=print) { stack.push(top.lchild); top = stack.peek(); } //判断栈顶元素的右子树是否被打印了 else if(top.rchild!=null && top.rchild!= print) { stack.push(top.rchild); top = stack.peek(); } //左子树右子树都被打印了,则打印栈顶元素 else { print = stack.pop(); list.add(print); } } return list; } public static void main(String[] args) { BinaryTree bt = new BinaryTree(); //测试数据 int[] array = {3,5,-1,9,-1,-1,7,11,-1,-1,13,-1,-1}; Node root =bt.createTree(array); ArrayList<Node> list = bt.postOrder(root); for(Node node : list) { System.out.print(node.value + " "); } }}
阅读全文
0 0
- 数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 二叉树的递归遍历与非递归算法实现
- 二叉树的递归遍历与非递归算法实现
- 数据结构----二叉树遍历的非递归算法实现
- [数据结构] 二叉树的递归与非递归遍历
- 【数据结构】二叉树的遍历(递归与非递归)
- 遍历二叉树的递归算法与非递归算法
- 二叉树创建、遍历的递归和非递归实现
- Java实现二叉树的创建、递归/非递归遍历
- 二叉树的创建遍历-递归与非递归
- 二叉树的创建与前中后序遍历递归非递归
- 二叉树的创建和递归与非递归遍历
- 《算法导论》二叉树遍历的递归&非递归实现
- 二叉树遍历的递归与非递归算法
- 二叉树的遍历算法(递归与非递归)
- 遍历二叉树的递归与非递归算法
- 二叉树的递归与非递归遍历算法
- 函数的返回值是指针--练习
- 三三笔记-mysql常用语句
- 正则表达式基础+进阶
- 也许我可以代表90后迷茫又堕落的那些大学生
- 题目:有 n 个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位。
- 数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
- C++ 的map操作
- server——短信提醒
- enum的小知识
- 总结骏汇项目的一些js逻辑问题(二)之添加意向银行并可排序
- Linux常用压缩和解压缩命令
- 【机器学习实战】第3章 决策树(DecisionTree)
- Python3:operator模块中的itemgetter()函数
- Spark 之 Spark SQL源码函数解读及UDF/UDAF例子 spark研习第六集