树的创建以及树的遍历(递归和非递归方法)
来源:互联网 发布:java模拟器安卓版7.0 编辑:程序博客网 时间:2024/05/16 17:02
分别用递归和非递归方法遍历树。包含前序遍历,中序遍历,后序遍历。本人觉得构建树的方法也很妙,有了这个方法,直接输入数组转化成树,之后测试代码就方便多了。
//定义树 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));
阅读全文
0 0
- 树的创建以及树的遍历(递归和非递归方法)
- 二叉树的创建,递归遍历以及非递归遍历
- 二叉树创建、遍历的递归和非递归实现
- 二叉树的创建及递归和非递归遍历
- 二叉树的创建,递归和非递归遍历
- 二叉树的创建和递归与非递归遍历
- 二叉树的遍历 -- 递归和非递归方法
- 二叉树的递归和非递归遍历方法
- 二叉树的递归和非递归遍历方法
- 树的递归和非递归遍历
- 二叉树的创建和各种递归非递归遍历方法研究(一)
- 二叉树的非递归遍历以及递归遍历
- 二叉树的递归遍历以及非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 树的递归创建和递归遍历
- 二叉树的创建|非递归遍历
- 二叉树的创建和递归遍历和非递归遍历
- 二叉树的先序递归以及非递归遍历
- bitset优化Floyd求传递闭包
- 九度1456:胜利大逃亡
- UI控件之UISlider
- jenkins 构建时动态生成版本号
- 热修复初识
- 树的创建以及树的遍历(递归和非递归方法)
- 测试
- Test 10 for NOIP
- linux系统通过Nginx部署Django
- Android OpenGL ES 绘图 --简单绘图
- css书写规范
- ArrayList
- Ubuntu 17.04更换源
- Qt 语言国际化 语言家相关