二叉树的遍历
来源:互联网 发布:淘宝的消费总额怎么看 编辑:程序博客网 时间:2024/06/07 19:22
树节点类:public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}
先序遍历:
递归:
public ArrayList<Integer> preOrderTraverseRecur(TreeNode root) {if(root == null) {return null;}ArrayList<Integer> result = new ArrayList<Integer>();result.add(root.val);if(root.left != null) {<span style="white-space: pre;"></span>result.addAll(preOrderTraverseRecur(root.left));}if(root.right != null) {result.addAll(preOrderTraverseRecur(root.right));}</span>
return result;}
非递归
public ArrayList<Integer> preOrderTraverseNoRecur(TreeNode root) {if(root == null) {return null;}ArrayList<Integer> result = new ArrayList<Integer>();Stack<TreeNode> stack = new Stack<TreeNode>();stack.push(root);result.add(root.val);while(!stack.empty()) {if(stack.peek().left != null && !result.contains(stack.peek().left.val)) {result.add(stack.peek().left.val);stack.push(stack.peek().left);} else {if(stack.peek().right != null && !result.contains(stack.peek().right.val)) {result.add(stack.peek().right.val);stack.push(stack.peek().right);} else {stack.pop();}}}return result;}
中序遍历:
递归:
public ArrayList<Integer> inOrderTraverseRecur(TreeNode root) {if(root == null) {return null;}ArrayList<Integer> result = new ArrayList<Integer>();if(root.left != null) {result.addAll(inOrderTraverseRecur(root.left));}result.add(root.val);if(root.right != null) {result.addAll(inOrderTraverseRecur(root.right));}return result;}
非递归:
public ArrayList<Integer> inOrderTraverseNoRecur(TreeNode root) {if(root == null) {return null;}ArrayList<Integer> result = new ArrayList<Integer>();Stack<TreeNode> stack = new Stack<TreeNode>();stack.push(root);while(!stack.empty()) {if(stack.peek().left != null && !result.contains(stack.peek().left.val)) {stack.push(stack.peek().left);} else {if(stack.peek().right != null && !result.contains(stack.peek().right.val)) {TreeNode temp = stack.peek();result.add(stack.pop().val);stack.push(temp.right);} else {result.add(stack.pop().val);}}}return result;}
后序遍历:
递归:public ArrayList<Integer> postOrderTraverseRecur(TreeNode root) {if(root == null) {return null;}ArrayList<Integer> result = new ArrayList<Integer>();if(root.left != null) {result.addAll(postOrderTraverseRecur(root.left));}if(root.right != null) {result.addAll(postOrderTraverseRecur(root.right));}result.add(root.val);return result;}
非递归:
public ArrayList<Integer> postOrderTraverseNoRecur(TreeNode root) {if(root == null) {return null;}ArrayList<Integer> result = new ArrayList<Integer>();Stack<TreeNode> stack = new Stack<TreeNode>();stack.push(root);while(!stack.empty()) {if(stack.peek().left != null && !result.contains(stack.peek().left.val)) {stack.push(stack.peek().left);} else {if(stack.peek().right != null && !result.contains(stack.peek().right.val)) {stack.push(stack.peek().right);} else {result.add(stack.pop().val);}}}return result;}
层序遍历:
public ArrayList<Integer> levelOrderTraverse(TreeNode root) {if(root == null) {return null;}LinkedList<TreeNode> queue = new LinkedList<TreeNode>(); ArrayList<Integer> result = new ArrayList<Integer>(); queue.add(root); result.add(root.val); while(!(queue.size() == 0)) { TreeNode head = queue.remove(); if(head.left != null ) { queue.add(head.left); result.add(head.left.val); } if(head.right != null ) { queue.add(head.right); result.add(head.right.val); } } return result; }
结果测试:
Test.java:
import java.util.ArrayList;public class Test {public static void main(String[] args) {// TODO Auto-generated method stub/** * 构建一颗二叉树
* 1 * / \ * 2 3 * / \ \ * 7 4 8 * / \ / * 6 5 9 */BinaryTree bt = new BinaryTree();TreeNode root = new TreeNode(1);TreeNode node1 = new TreeNode(2);TreeNode node2 = new TreeNode(3);TreeNode node3 = new TreeNode(7);TreeNode node4 = new TreeNode(4);TreeNode node5 = new TreeNode(8);TreeNode node6 = new TreeNode(6);TreeNode node7 = new TreeNode(5);TreeNode node8 = new TreeNode(9);root.left = node1;root.right = node2;node1.left = node3;node1.right = node4;node2.right = node5;node4.left = node6;node4.right = node7;node5.left = node8;/** * 测试递归先序遍历 * 正确输出为: 1 2 7 4 6 5 3 8 9 */ ArrayList<Integer> preOrderResultRecur = new ArrayList<Integer>(); preOrderResultRecur = bt.preOrderTraverseRecur(root); System.out.println("递归先序遍历的结果为: "); for(Integer integer : preOrderResultRecur) { System.out.print(integer + " "); } System.out.println(); /** * 测试非递归先序遍历 * 正确输出为: 1 2 7 4 6 5 3 8 9 */ ArrayList<Integer> preOrderResultNoRecur = new ArrayList<Integer>(); preOrderResultNoRecur = bt.preOrderTraverseNoRecur(root); System.out.println("非递归先序遍历的结果为: "); for(Integer integer : preOrderResultNoRecur) { System.out.print(integer + " "); } System.out.println(); /** * 测试递归中序遍历 * 正确输出为: 7 2 6 4 5 1 3 9 8 */ ArrayList<Integer> inOrderResultRecur = new ArrayList<Integer>(); inOrderResultRecur = bt.inOrderTraverseRecur(root); System.out.println("递归中序遍历的结果为: "); for(Integer integer : inOrderResultRecur) { System.out.print(integer + " "); } System.out.println(); /** * 测试非递归中序遍历 * 正确输出为: 7 2 6 4 5 1 3 9 8 */ ArrayList<Integer> inOrderResultNoRecur = new ArrayList<Integer>(); inOrderResultNoRecur = bt.inOrderTraverseNoRecur(root); System.out.println("非递归中序遍历的结果为: "); for(Integer integer : inOrderResultNoRecur) { System.out.print(integer + " "); } System.out.println(); /** * 测试递归后序遍历 * 正确输出为: 7 6 5 4 2 9 8 3 1 */ ArrayList<Integer> postOrderResultRecur = new ArrayList<Integer>(); postOrderResultRecur = bt.postOrderTraverseRecur(root); System.out.println("递归后序遍历的结果为: "); for(Integer integer : postOrderResultRecur) { System.out.print(integer + " "); } System.out.println(); /** * 测试非递归后序遍历 * 正确输出为: 7 6 5 4 2 9 8 3 1 */ ArrayList<Integer> postOrderResultNoRecur = new ArrayList<Integer>(); postOrderResultNoRecur = bt.postOrderTraverseNoRecur(root); System.out.println("非递归后序遍历的结果为: "); for(Integer integer : postOrderResultNoRecur) { System.out.print(integer + " "); } System.out.println(); /** * 测试层序遍历 * 正确输出为: 1 2 3 7 4 8 6 5 9 */ ArrayList<Integer> levelOrderResult = new ArrayList<Integer>(); levelOrderResult = bt.levelOrderTraverse(root); System.out.println("层序遍历的结果为: "); for(Integer integer : levelOrderResult) { System.out.print(integer + " "); } System.out.println(); }}
结果输出:
0 0
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- Vuforia SDK---- AR开发vuforia 相机自动对焦代码实现
- iOS 字体转换
- Myeclipse 导入别人的项目,汉字是乱码怎么办?
- 无处不在的二分查找
- 什么是ANR 如何避免它?
- 二叉树的遍历
- hdu1087 LIS变形
- 快速熟悉项目代码
- 对于MathType中公式与文字错位的问题怎么解决
- Spring源代码解析(三):Spring JDBC
- C#更改groupbox边框颜色
- 3.7.5 event_loop:事件循环
- 64位win7系统中JDK的安装及环境变量的配置
- Android Studio常用插件