模板在二叉树和队列中的应用(借助队列广度遍历二叉树)
2013-10-07 20:07
441 查看
接着这两三天的时间把模板、队列、链表、二叉树等知识又过了一遍。也亲自动手写了以上数据结构,算是把当年学数据结构时没做完的实验重新做了一遍,有点小小的成就感。因此写此博文以记之,以备以后用的时候查阅。
模板和头文件的知识前面两篇博文已经大概交代了一下,以前没学模板的时候看到这东西头就大,现在学习了一下感觉模板对于代码的重用对提高开发效率还是很有帮助的。
一、链表的实现:
View Code
需要注意的几点地方:
1、void Create(BinaryTree<T> * &root);中&不能少。如果不要&递归每次生成左子树和右子树每次不会生成新的节点。
2、统计叶节点的思路“当一个节点的左子树和右子树为空时,该节点就是叶节点”if (!(p->left)&&!(p->right)){count++; }。
3、计算树的深度“每递归往下走一层,对比当前子树深度是否大于当前记录的值,大于就替换”
4、广度遍历二叉树时需要用到队列,队列的元素师指向树的指针,从根节点的指针开始入队,每个while()循环把当前队头节点的两个节点入队。所以循环一共循环非叶节点个数减一次,减一主要是根节点一开始就入队了。最后队列中就按层次的顺序排列了树的部分节点。注意不是全部节点都在队列中,入队和出队是动态的过程,不是一口气全部节点全部入队再出队。
模板和头文件的知识前面两篇博文已经大概交代了一下,以前没学模板的时候看到这东西头就大,现在学习了一下感觉模板对于代码的重用对提高开发效率还是很有帮助的。
一、链表的实现:
#include "Queue.h" #ifndef BINARYTREE_H_H #define BINARYTREE_H_H template<class T> class BinaryTree { private: BinaryTree<T> *left; BinaryTree<T> *right; T data; public: void Create(BinaryTree<T> * &root); void PreOrder(BinaryTree<T> *p); void InOrder(BinaryTree<T> *p); void PostOrder(BinaryTree<T> *p); void CountLeaf(BinaryTree<T> *p,int &count); void BinatyTreeDepth(BinaryTree<T> *p,int level,int &count); void LayerOrder(BinaryTree<T> *t); }; #endif template<class T> void BinaryTree<T>::Create(BinaryTree<T> * &root) { T a; cin>>a; if (a!='*') { root=new BinaryTree; root->data=a; Create(root->left); Create(root->right); } else root=NULL; } template<class T> void BinaryTree<T>::PreOrder(BinaryTree<T> *p) { if (p!=NULL) { cout<<p->data<<endl; PreOrder(p->left); PreOrder(p->right); } } template<class T> void BinaryTree<T>::InOrder(BinaryTree<T> *p) { if (p!=NULL) { InOrder(p->left); cout<<p->data<<endl; InOrder(p->right); } } template<class T> void BinaryTree<T>::PostOrder(BinaryTree<T> *p) { if (p!=NULL) { PostOrder(p->left); PostOrder(p->right); cout<<p->data<<endl; } } template<class T> void BinaryTree<T>::CountLeaf(BinaryTree<T> *p,int &count) { if (p) { if (!(p->left)&&!(p->right)) { count++; } //注意这两句话外层这个if语句大括号里 CountLeaf(p->left,count); CountLeaf(p->right,count); } } template<class T> void BinaryTree<T>::BinatyTreeDepth(BinaryTree<T> *p,int level,int &count) { if (p) { if (level>count)count=level; BinatyTreeDepth(p->left,level+1,count); BinatyTreeDepth(p->right,level+1,count); } } template<class T> void BinaryTree<T>::LayerOrder(BinaryTree<T> *t) { Queue<BinaryTree<T>*> q; BinaryTree<T> *p; T da; q.EnQueue(t); while(!q.QueueEmpty()) { p=q.DeQueue(); da=p->data; cout<<da<<endl; if(p->left) q.EnQueue(p->left); if(p->right) q.EnQueue(p->right); } }
View Code
需要注意的几点地方:
1、void Create(BinaryTree<T> * &root);中&不能少。如果不要&递归每次生成左子树和右子树每次不会生成新的节点。
2、统计叶节点的思路“当一个节点的左子树和右子树为空时,该节点就是叶节点”if (!(p->left)&&!(p->right)){count++; }。
3、计算树的深度“每递归往下走一层,对比当前子树深度是否大于当前记录的值,大于就替换”
4、广度遍历二叉树时需要用到队列,队列的元素师指向树的指针,从根节点的指针开始入队,每个while()循环把当前队头节点的两个节点入队。所以循环一共循环非叶节点个数减一次,减一主要是根节点一开始就入队了。最后队列中就按层次的顺序排列了树的部分节点。注意不是全部节点都在队列中,入队和出队是动态的过程,不是一口气全部节点全部入队再出队。
相关文章推荐
- 模板二叉树的创建与深度遍历(栈、递归)和广度优先遍历(队列)
- [二叉树专题]:广度优先:按层次遍历二叉树的非递归实现||使用队列实现层次遍历二叉树
- C++非递归队列实现二叉树的广度优先遍历
- c语言实现二叉树层次遍历(借助队列实现)
- 102.LeetCode Binary Tree Level Order Traversal(easy)[二叉树层次遍历 广度搜索 队列]
- python 用栈和队列实现二叉树的深度优先遍历(三种)和广度优先遍历
- 遍历二叉树——递归和非递归(栈和队列的应用)实现
- 二叉树层次遍历(借助队列实现)
- 二叉树的深度优先遍历(栈)和广度优先遍历(队列)
- 二叉树的深度优先遍历(栈)和广度优先遍历(队列)
- 二叉树按层次遍历--队列实现
- C语言队列实现广度优先遍历
- 二叉树构造:二叉树的广度优先遍历
- 二叉树的深度与广度遍历及前序遍历递归非递归实现
- 二叉树的深度优先遍历、广度优先遍历和非递归遍历、图的深度优先和广度优先遍历
- 二叉树深度优先遍历和广度优先遍历
- 二叉树的遍历及其应用
- 遍历二叉树 - 基于队列的BFS
- 二叉树的三种遍历的应用(表达式,求深度,叶子数,结点数,二叉树的建立,复制)
- 中序二叉树、队列实现层次遍历、中序线索二叉树的创建与遍历