二叉树遍历的所有递归和迭代实现
2016-06-16 02:33
423 查看
@[二叉树|排列|前序|中序|后序]
gitthub:https://github.com/1414648814
无论是在面试过程中还是实际项目中,我们都会遇见二叉树的遍历,当然这个只要了解了原理,其实很简单;
二叉树的排列包括(注意顺序)
* 前序排列:先遍历树的跟节点,然后是树的左子节点,再然后才是右子节点;
* 中序排列:先遍历树的左子节点,然后是跟节点,再然后才是右子节点;
* 后序排列:先遍历树的左子节点,然后是树的右子节点,再然后才是跟节点;
首先是节点的声明
代码
gitthub:https://github.com/1414648814
无论是在面试过程中还是实际项目中,我们都会遇见二叉树的遍历,当然这个只要了解了原理,其实很简单;
二叉树的排列包括(注意顺序)
* 前序排列:先遍历树的跟节点,然后是树的左子节点,再然后才是右子节点;
* 中序排列:先遍历树的左子节点,然后是跟节点,再然后才是右子节点;
* 后序排列:先遍历树的左子节点,然后是树的右子节点,再然后才是跟节点;
首先是节点的声明
function TreeNode(val) { this.val = val; this.left = this.right = null; }
1.前序遍历
1.递归实现
核心思想:注意函数要分开写,因为这是个递归函数,不然要重新初始化数组了;代码
/** * @param {TreeNode} root * @return {number[]} */ var preorderTraversal = function(root) { var result = []; preorder(root); return result; function preorder(root) { if (root === null) return; result.push(root.val); preorder(root.left); preorder(root.right); } };
2.迭代实现
核心思想:原理类似,都是需要栈来实现,但是要注意第二个先遍历是因为栈是后进先出;var preorderTraversal1 = function(root) { var result = []; var stack = []; while (root || stack.length!== 0) { while (root) { stack.push(root); result.push(root.val); root = root.left; } root = stack[stack.length-1]; stack.pop(); root = root.right; } return result; }; var preorderTraversal2 = function(root) { var result = []; var stack = []; var cur = null; stack.push(root); while (cur = stack.pop()) { result.push(cur.val); if (cur.right) stack.push(cur.right); if (cur.left) stack.push(cur.left); } return result; };
2.中序遍历
1.递归实现
核心思想var inorderTraversal = function(root) { var result = []; inorder(root); return result; function inorder(root) { if (root === null) return; inorder(root.left); result.push(root.val); inorder(root.right); } };
2.迭代实现
核心思想var inorderTraversal = function(root) { var result = []; var stack = []; while (root || stack.length!== 0) { while (root) { stack.push(root); root = root.left; } root = stack[stack.length-1]; result.push(root.val); stack.pop(); root = root.right; } return result; };
3.后序遍历
1.递归实现
核心思想var postorderTraversal = function(root) { var result = []; postorder(root); return result; function postorder(root) { if (root === null) return; postorder(root.left); postorder(root.right); result.push(root.val); } };
2.迭代实现
核心思想var postorderTraversal1 = function(root) { var result = []; var stack = []; while (root || stack.length!== 0) { while (root) { stack.push(root); result.unshift(root.val); root = root.right; } root = stack[stack.length-1]; stack.pop(); root = root.left; } return result; }; var postorderTraversal2 = function(root) { var stack = []; var values = []; if (root) stack.push(root); while(stack.length > 0) { var node = stack.pop(); values.unshift(node.val); if (node.left) stack.push(node.left); if (node.right) stack.push(node.right); } return values; };
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 文件遍历排序函数
- C#递归算法之分而治之策略
- Lua 学习笔记之C API 遍历 Table实现代码
- 有关数据库SQL递归查询在不同数据库中的实现方法
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- C#中的递归APS和CPS模式详解
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- WinForm实现按名称递归查找控件的方法
- C#递归方法实现无限级分类显示效果实例
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构