树的创建以及树的遍历(递归和非递归方法)
2017-08-29 16:24
155 查看
分别用递归和非递归方法遍历树。包含前序遍历,中序遍历,后序遍历。本人觉得构建树的方法也很妙,有了这个方法,直接输入数组转化成树,之后测试代码就方便多了。
//定义树 function TreeNode (value,left,right) { this.value = value; this.left = null; this.right = null; } //把数组转化成树 function arrToTree (arr) { var tree = []; tree[0] = new TreeNode(arr[0]);//用数组保存结点,之后添加的时候方便查找是哪个结点的子树 for (var i=1; i < arr.length; i++) { tree[i] = new TreeNode(arr[i]); if (i % 2 ==1) { if(arr[i] != '') { tree[parseInt((i-1)/2)].left = tree[i];//寻找父节点,并判断是左子树还是右子树 } } else { if(arr[i] != '') { tree[parseInt((i-1)/2)].right = tree[i]; } } } return tree[0]; } //算法1: 前序遍历树 //参数里面放result是一个很好的不会把result每次清空的办法 function preOrder (tree,result) { if (tree == null) { return; } result.push(tree.value); preOrder(tree.left,result); preOrder(tree.right,result); return result; } //算法2: 前序遍历树非递归方法 function preOrder2 (tree) { var stack = []; var result = []; if (tree == null) { return; } stack.push(tree); while (stack.length > 0) { var node = stack.pop(); result.push(node.value); //注意进栈顺序,跟着算法走一遍看看 if(node.right != null) { stack.push(node.right); } if(node.left != null) { stack.push(node.left); } } return result; } //var tree = arrToTree([1,2,3,4,5,'',6,7,8,9,'','','','','',6]); //console.log(preOrder2(tree)); //算法3: 中序遍历递归方法 function midOrder (tree,result) { if(tree == null) { return; } midOrder (tree.left,result); result.push(tree.value); midOrder (tree.right,result); return result; } //var tree = arrToTree([1,2,3,4,5,'',6,7,8,9,'','','','','','','',10]); //console.log(midOrder(tree,[])); //算法4: 中序遍历非递归方法 function midOrder2 (tree) { var stack = []; var result = []; var node = tree; while (stack.length > 0 || node) { if (node) { stack.push(node); node = node.left; } else { var node = stack.pop(); result.push(node.value); node = node.right; } } return result; } //算法5: 后序遍历递归算法 function postOrder(tree,result) { if (tree == null) { return; } postOrder(tree.left,result); postOrder(tree.right,result); result.push(tree.value); return result; } //算法6: 后序遍历非递归算法 function postOrder2(node) { var stack = []; var result = []; stack.push(node); while (stack.length > 0) { var tmp = stack[stack.length-1]; if (tmp.left && tmp.left != node && tmp.right != node) { stack.push(tmp.left); } else if (tmp.right && tmp.right != node) { stack.push(tmp.right); } else { var cnode = stack.pop(); result.push(cnode.value); node = tmp; } } return result; } var tree = arrToTree([1,2,3,4,5,'',6,7,8,9,'','','','','','','',10]); console.log(tree); console.log(postOrder2(tree));
相关文章推荐
- 二叉树(一):二叉树的创建以及三种遍历方法的递归实现
- 二叉树的四种遍历 (六个方法递归 非递归都有 包含二叉树的创建java方法)
- 二叉树的递归创建以及前序,中序,后序遍历
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
- 用c语言创建一颗二叉树,用递归方法实现对其进行先序、中序和后序遍历的操作。
- Java学习之单链表创建以及正向遍历和反向遍历方法
- NSDate NSArray创建、遍历以及修改等方法
- 二叉树的创建以及遍历方法
- 二叉树的创建,以及递归前中后序以及层次遍历
- 创建二叉树的两种方法以及三种遍历方法
- 二叉树的创建以及递归非递归遍历
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 二叉树的创建、销毁、各种递归、循环遍历方法(可运行测试)
- 递归方法实现二叉树的创建,遍历
- 二叉树的先序、中序以及后序遍历(递归与非递归方法)
- 二叉树的创建、前序中序后序递归遍历与非递归遍历、层序遍历以及二叉树简单应用的C语言实现
- 【C++】二叉树的创建方法及其遍历的递归与非递归方法总结
- 完全二叉树的JAVA实现(以及非递归遍历方法)
- java创建二叉树以及8种遍历方法
- 二叉树的创建,先序、中序、后序遍历的递归实现以及层序遍历