遍历多叉树(递归、非递归广度优先、深度优先)

简单的遍历一个树形结构数据的几种方法、非递归方法效率最好。

  1 (function (window, undefined) {
  2     var treeNodes = [
  3        {
  4             id: 1,
  5             name: ‘1‘,
  6             children: [
  7                  {
  8                       id: 11,
  9                       name: ‘11‘,
 10                       children: [
 11                            {
 12                                 id: 111,
 13                                 name: ‘111‘,
 14                                 children:[]
 15                            },
 16                            {
 17                                 id: 112,
 18                                 name: ‘112‘
 19                            }
 20                       ]
 21                  },
 22                  {
 23                       id: 12,
 24                       name: ‘12‘,
 25                       children: []
 26                  }
 27             ],
 28             users: []
 29        },
 30        {
 31             id: 2,
 32             name: ‘2‘,
 33             children: [
 34                 {
 35                     id: 22,
 36                     name: ‘22‘,
 37                     children: []
 38                 }
 39             ]
 40        }
 41     ];
 42
 43     //递归实现
 44     var parseTreeJson = function(treeNodes){
 45        var treeNodes = treeNodes || {};
 46
 47        for (var i = 0, len = treeNodes.length; i < len; i++) {
 48
 49             var childs = treeNodes[i].children;
 50
 51             console.log(treeNodes[i].id);
 52
 53             if(childs && childs.length > 0){
 54                  parseTreeJson(childs);
 55             }
 56        }
 57     };
 58
 59     console.log(‘------------- 递归实现 ------------------‘);
 60     parseTreeJson(treeNodes);
 61
 62     //非递归广度优先实现
 63     var iterator1 = function (treeNodes) {
 64         var stack = [];
 65
 66         if (!treeNodes || !treeNodes.length) return;
 67
 68         //先将第一层节点放入栈
 69         for (var i = 0, len = treeNodes.length; i < len; i++) {
 70             stack.push(treeNodes[i]);
 71         }
 72
 73         var item;
 74
 75         while (stack.length) {
 76             item = stack.shift();
 77
 78             console.log(item.id);
 79
 80             //如果该节点有子节点,继续添加进入栈底
 81             if (item.children && item.children.length) {
 82                 //len = item.children.length;
 83
 84                 // for (i = 0; i < len; i++) {
 85                 //     stack.push(item.children[i]);
 86                 // }
 87
 88                 stack = stack.concat(item.children);
 89             }
 90         }
 91     };
 92
 93     console.log(‘------------- 非递归广度优先实现 ------------------‘);
 94     iterator1(treeNodes);
 95
 96     //非递归深度优先实现
 97     var iterator2 = function (treeNodes) {
 98         var stack = [];
 99
100         if (!treeNodes || !treeNodes.length) return;
101
102         //先将第一层节点放入栈
103         for (var i = 0, len = treeNodes.length; i < len; i++) {
104             stack.push(treeNodes[i]);
105         }
106
107         var item;
108
109         while (stack.length) {
110             item = stack.shift();
111
112             console.log(item.id);
113
114             //如果该节点有子节点,继续添加进入栈顶
115             if (item.children && item.children.length) {
116                 // len = item.children.length;
117
118                 // for (; len; len--) {
119                 //     stack.unshift(item.children[len - 1]);
120                 // }
121                 stack = item.children.concat(stack);
122             }
123         }
124     };
125
126     console.log(‘------------- 非递归深度优先实现 ------------------‘);
127     iterator2(treeNodes);
128 })(window);
时间: 2024-11-05 14:56:31

遍历多叉树(递归、非递归广度优先、深度优先)的相关文章

C#先序遍历2叉树(非递归)

找了下先序遍历二叉树C# 实现貌似没有 顺手些了一个 大致思路是: 传入根节点,然后依次循环其子节点推入到栈中, 当推入的节点没有子节点的时候(叶子)或者所有子节点均已经遍历过后(上一次遍历的节点是该节点的右子节点),再依次退出栈. 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 nam

二叉树总结—建树和4种遍历方式(递归&amp;&amp;非递归)

今天总结一下二叉树,要考离散了,求不挂!二叉树最重要的就是 建立.4种遍历方式,简单应用,如何判断两颗二叉树是否相似 二叉树分为 :1.完全二叉树  2.满二叉树 结构性质: 1).满二叉树 高度为h ,节点数则为 2^h - 1,且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度} 2).n个节点的 完全二叉树 深度为 int(log2n)(以2为底n的对数)+ 1: 3).非空二叉树 叶子节点个数==双分支节点数+1 4).非空二叉树 某节点编号 n  若有左孩

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A

【算法拾遗】二分查找递归非递归实现

转载请注明出处:http://blog.csdn.net/ns_code/article/details/33747953 本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,以下是递归非递归的实现. 非递归实现: /* 非递归实现,返回对应的序号 */ int BinarySearch(int *arr,int len,int key) { if(arr==NULL || len<1) return -1; int low = 0; int high = len-1; while(l

2015-03-15---二叉树递归(非递归)实现先序、中序、后序遍历(附代码)

今天说好的不碰代码的,后来还是没忍住,学了学数据结构和算法,就先讲讲先序中序和后序遍历吧,我还写了代码,一套递归方式实现遍历二叉树,还有两套非递归方式遍历二叉树, 从简单的开始,因为二叉树的所有操作都是要求在能够遍历的基础上啊. 学过数据结构的肯定都明白遍历顺序, 先序遍历就是先自己,然后左子树,然后右子树, 中序遍历就是先左子树,然后自己,然后右子树 后序遍历就是先左子树,然后右子树,然后自己 比如上图这个很简单的二叉树: 先序遍历:1 2 4 5 3 6 7 中序遍历:4 2 5 1 6 3

二叉树基础(创建方法,遍历方法(前序/中序/后序/层序、递归/非递归)

二叉树的创建及遍历是很多二叉树问题的基础,递归遍历逻辑清晰,代码简约漂亮,然则效率低下(所有递归方案的通病,非不得已不用递归): 非递归遍历高效,却不是能信手写出来的,特别是后续非递归遍历,相信很多资深码工也有这样的经历: 5年前学习了二叉树的非递归遍历,一个月前复习了并达到能熟练写出的程度,在不参考任何资料的情况下,今天却怎样也写不出来. 如果你也有过这种经历,恭喜你,这说明你是一个正常人…… 另一方面市面上有些国人写的教材,各种语法.逻辑错误层出不起,不知祸害了多少未来的码工,深感痛心. 印

作业 树和森林 遍历(递归/非递归先序,递归/非递归后序,递归层次)

1 #include <iostream> 2 #include"queue.h"//之前写的类 3 #include"stack.h" //之前写的类 4 using namespace std; 5 6 template <class T> 7 class Tree; 8 9 //======================================== 10 // 树节点类声明 11 template <class T>

二叉树的前序/中序/后续遍历(递归+非递归)

这几日又把二叉树的递归写了一遍,原来是用C写的,自己写了一个栈,这一次直接用的C++,使用了自带的栈结构.代码如下: 1 /************************************************************************* 2 > Author: Yves 3 > E-mail: [email protected] 4 > File Name: BiTreeNew.cpp 5 > Description: ... 6 > Cre

2013-03-17---二叉树递归,非递归实现(附代码)深度,叶子节点数量,逐行打印二叉树

昨天晚上没有发文章,说来话长啊,昨天不知道是csdn的问题,还是我的问题,我访问了半天,访问不上网站啊,后来12点多了,就睡了.上一篇文章说到了二叉树的先序,中序,后序遍历问题,这次还是说的简单的一点,说计算二叉树的深度,和叶子节点数量 int ceng(Node *pRoot) //计算层数,递归实现 { int left = 0; int right = 0; int res = 0; if (pRoot == NULL) { return 0; } if (pRoot->pLeft !=

二叉树,递归非递归遍历算法(全)

包含了所有的非递归和递归的算法: #include<iostream> #include<queue> #include<stack> using namespace std; //二叉树结点的描述 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode,*BiTree; //按先序遍历创建二叉树 //BiTree *CreateBiTree() //返回结