二叉树的深度优先与广度优先算法
来源:互联网 发布:淘宝客服兼职 靠谱吗 编辑:程序博客网 时间:2024/06/05 05:18
<span style="font-family: Arial, Helvetica, sans-serif;">package org.zbus.test;</span>
import java.util.ArrayDeque;public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int value){ this.value=value; } } TreeNode root; public BinaryTree(int[] array){ root=makeBinaryTreeByArray(array,1); } /** * 采用递归的方式创建一颗二叉树 * 传入的是二叉树的数组表示法 * 构造后是二叉树的二叉链表表示法 */ public static TreeNode makeBinaryTreeByArray(int[] array,int index){ if(index<array.length){ int value=array[index]; if(value!=0){ TreeNode t=new TreeNode(value); array[index]=0; t.left=makeBinaryTreeByArray(array,index*2); t.right=makeBinaryTreeByArray(array,index*2+1); return t; } } return null; } /** * 深度优先遍历,相当于先根遍历 * 采用非递归实现 * 需要辅助数据结构:栈 */ public void depthOrderTraversal(){ if(root==null){ System.out.println("empty tree"); return; } ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>(); stack.push(root); while(stack.isEmpty()==false){ TreeNode node=stack.pop(); System.out.print(node.value+" "); if(node.right!=null){ stack.push(node.right); } if(node.left!=null){ stack.push(node.left); } } System.out.print("\n"); } /** * 广度优先遍历 * 采用非递归实现 * 需要辅助数据结构:队列 */ public void levelOrderTraversal(){ if(root==null){ System.out.println("empty tree"); return; } ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>(); queue.add(root); while(queue.isEmpty()==false){ TreeNode node=queue.remove(); System.out.print(node.value+" "); if(node.left!=null){ queue.add(node.left); } if(node.right!=null){ queue.add(node.right); } } System.out.print("\n"); } /** * 13 * / \ * 65 5 * / \ \ * 97 25 37 * / /\ / * 22 4 28 32 */ public static void main(String[] args) { int[] arr={0,13,65,5,97,25,0,37,22,0,4,28,0,0,32,0}; BinaryTree tree=new BinaryTree(arr); tree.depthOrderTraversal(); tree.levelOrderTraversal(); }}
二叉树的深度优先遍历和先序遍历结果一样的。 思想是采用栈, 首先将根结点压入栈,如果栈不为空,而后出栈并输出当前结点中值,而后先把右子树压入栈,再把左子树压入栈,再判断栈是否为空,循环.....
步骤如下:
(1) 树的根结点入栈
(2)判断栈是否为空,不为空,则出栈,并输出出栈树结点的值
(3)出栈树结点的右子树入栈
(4)出栈树结点的左子树入栈
(5)循环回到(2)
二叉树广义优先遍历为层遍历(从左到右)。思想就是采用队列,步骤如下:
(1) 树的根结点入队
(2)判断队列是否为空,不为空,则出队,并输出出队树结点的值
(3)出队树结点的左子树进入队列
(4)出队树结点的右子树进入队列
(5)循环回到(2)
0 0
- 二叉树的深度优先与广度优先算法
- 二叉树的深度优先遍历与广度优先遍历
- 二叉树的深度优先与广度优先遍历
- 二叉树的深度优先遍历与广度优先遍历
- 二叉树的深度优先遍历与广度优先遍历
- 二叉树的深度优先与广度优先
- 二叉树的深度优先遍历与广度优先遍历
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
- 树的广度优先遍历与深度优先遍历算法
- 二叉树深度优先与广度优先遍历
- 深度优先算法、广度优先算法 与 图的遍历
- 深度优先遍历与广度优先遍历(c++二叉树算法实现)
- 算法与数据结构(2) -- 二叉树深度优先遍历和广度优先遍历
- 深度优先与广度优先算法
- 深度优先搜索算法和广度优先搜索算法的搜索次序(二叉树)
- 二叉树的深度优先和广度优先遍历
- 二叉树的深度优先和广度优先遍历
- 奇数阶魔方
- java适配器模式
- android开发通知常用设置方法
- Andorid总结 - Bound Services
- 【模板】快速幂
- 二叉树的深度优先与广度优先算法
- Java 从HTML中取得想要的信息再进行处理
- 怎样将Activity设置成窗口模式
- 查询数据库时间显示 时 分 秒
- mybatis-generator使用之MyBatis Generator配置文件翻译
- android 城市列表
- IOS 数组去重的几种方式
- Linux常用命令汇总
- 用命令安装xcode和simulator