算法
来源:互联网 发布:淘宝拍摄时内裤的折法 编辑:程序博客网 时间:2024/06/03 03:32
(一)二叉树遍历
四种主要的遍历思想为:
深度优先:
前序遍历:根结点 —> 左子树 —> 右子树
中序遍历:左子树—> 根结点 —> 右子树
后序遍历:左子树 —> 右子树 —> 根结点
广度优先:
层次遍历:只需按层次遍历即可
例如,求下面二叉树的各种遍历
前序遍历:1 2 4 5 7 8 3 6
中序遍历:4 2 7 5 8 1 3 6
后序遍历:4 7 8 5 2 6 3 1
层次遍历:1 2 3 4 5 6 7 8
1、前序遍历
递归版本:
public void preOrderTraverse1(TreeNode root) { if (root != null) { System.out.print(root.val+" "); preOrderTraverse1(root.left); preOrderTraverse1(root.right); } }
非递归版本:(LinkedList替换成Stack也可以,下同)
public void preOrderTraverse2(TreeNode root) { LinkedList<TreeNode> stack = new LinkedList<>(); TreeNode pNode = root; while (pNode != null || !stack.isEmpty()) { if (pNode != null) { System.out.print(pNode.val+" "); stack.push(pNode); pNode = pNode.left; } else { //pNode == null && !stack.isEmpty() TreeNode node = stack.pop(); pNode = node.right; } } }
2、中序遍历
递归版本:
public void inOrderTraverse1(TreeNode root) { if (root != null) { inOrderTraverse1(root.left); System.out.print(root.val+" "); inOrderTraverse1(root.right); } }
非递归版本:
public void inOrderTraverse2(TreeNode root) { LinkedList<TreeNode> stack = new LinkedList<>(); TreeNode pNode = root; while (pNode != null || !stack.isEmpty()) { if (pNode != null) { stack.push(pNode); pNode = pNode.left; } else { //pNode == null && !stack.isEmpty() TreeNode node = stack.pop(); System.out.print(node.val+" "); pNode = node.right; } } }
3.后序遍历
递归版本:
public void postOrderTraverse1(TreeNode root) { if (root != null) { postOrderTraverse1(root.left); postOrderTraverse1(root.right); System.out.print(root.val+" "); } }
非递归版本:
方法1
public void postOrderTraversel(TreeNode root){ if(root == null) return; Stack<TreeNode> s = new Stack<TreeNode>(); Stack<TreeNode> outPut = new Stack<TreeNode>(); s.push(root); while(!s.isEmpty()){ TreeNode cur = s.pop(); outPut.push(cur); if(cur.left != null){ s.push(cur.left); } if(cur.right != null){ s.push(cur.right); } } while(!outPut.isEmpty()){ System.out.print(outPut.pop().val + " "); }}
图示:
方法2(不易理解)
public void posOrder1(TreeNode root) { Stack<TreeNode> stack1 = new Stack<>(); Stack<TreeNode> stack2 = new Stack<>(); TreeNode pNode = root; int i = 1; while(pNode != null || !stack1.empty()){ while (pNode != null){ stack1.push(pNode); stack2.push(0); pNode = pNode.left; } while(!stack1.empty() && stack2.peek() == i){ stack2.pop(); System.out.print(stack1.pop().element + " "); } if(!stack1.empty()){ stack2.pop(); stack2.push(1); pNode = stack1.peek(); pNode = pNode.right; } } }
4、层次遍历
public void levelTraverse(TreeNode root) { if (root == null) { return; } LinkedList<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); System.out.print(node.val+" "); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } }
5、深度优先遍历
其实深度遍历就是上面的前序、中序和后序。但是为了保证与广度优先遍历相照应,也写在这。代码也比较好理解,其实就是前序遍历,代码如下:
public void depthOrderTraverse(TreeNode root) { if (root == null) { return; } LinkedList<TreeNode> stack = new LinkedList<>(); stack.push(root); while (!stack.isEmpty()) { TreeNode node = stack.pop(); System.out.print(node.val+" "); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } }
阅读全文
0 0
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- Entity Framework Core 1.1 升级通告
- Consul 服务注册与服务发现
- 为什么要使用POJO(何为POJO)
- 2016.NET Core相关内容回顾
- CoreCRM 开发实录——开始之新项目的技术选择
- 算法
- .net core 源码解析-mvc route的注册,激活,调用流程(三)
- 正确使用云很重要——微软云其实不贵
- 管理软件公司与互联网公司的区别
- 一个简易的反射类库NMSReflector
- .net core 源码解析-web app是如何启动并接收处理请求(二) kestrel的启动
- Visual Studio Code 1.8版本添加了Hot Exit、Zen Mode及更多调试选项
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
- IdentityServer4 使用OpenID Connect添加用户身份验证