标签:div clear center 清除 返回 length binary com 图片
1,二叉树的遍历:
1,二叉树的遍历(Traversing Binary Tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次;
1,层次就是访问的次序,层次遍历是先访问第一层、再第二层等;
2,考虑的问题:
1,通用树结构的层次遍历算法是否可以用在二叉树结构上?如果可以,代码需要做怎样的改动?
1,可以的,二叉树是一种特别的树;
2,通用树使用的算法可以移植到二叉树使用的场合;
3,设计思路(游标):
1,提供一组遍历相关的函数,按层次访问二叉树中的数据元素;
4,层次遍历算法:
1,原料:class LinkQueue<T>;
2,游标:LinkQueue<T>::front();
3,思想:
1,begin() ==> 将根结点压入队列中;
2,current() ==> 访问队头元素指向的数据元素;
3,next() ==> 队头元素弹出,将队头元素的孩子压入队列中(核心);
4,end() ==> 判断队列是否为空;
5,层次遍历算法示例:
6,二叉树的层次遍历实现:
1 bool begin() // 为树中结点的遍历做初始化 2 { 3 bool ret = (root() != NULL); // 不能遍历空树 4 5 if( ret ) 6 { 7 m_queue.clear(); // 防止上一次没有调用完,这一次又调用,先清除 8 m_queue.add(root()); // 添加根结点 9 } 10 11 return ret; 12 } 13 14 bool end() // 队列长度为 0 则树遍历结束 15 { 16 return (m_queue.length() == 0); 17 } 18 19 bool next() // 队头元素弹出来,队头元素的孩子压入队列,同时指针一直指向下一个结点 20 { 21 bool ret = (m_queue.length() > 0); // 有元素才能移动游标 22 23 if( ret ) 24 { 25 BTreeNode<T>* node = m_queue.front(); // 将 node 指向对头元素 26 27 m_queue.remove(); // 队头元素拿出来,就指向了下一个结点 28 29 if( node->left != NULL ) // 压入左孩子 30 { 31 m_queue.add(node->left); 32 } 33 34 if( node->right != NULL ) // 压入右孩子 35 { 36 m_queue.add(node->right); 37 } 38 } 39 40 return ret; 41 } 42 43 T current() // 返回当前游标所指向的结点的元素 44 { 45 if( !end() ) // 遍历结束,不指向目标 46 { 47 return m_queue.front()->value; // 将游标指向结点元素返回, front() 函数已经指向了当前的对象 48 } 49 else 50 { 51 THROW_EXCEPTION(InvalidOperationException, "No value at current position ..."); // 还没开始或者结束的非法操作 52 } 53 }
标签:div clear center 清除 返回 length binary com 图片
原文地址:https://www.cnblogs.com/dishengAndziyu/p/10925990.html