您的位置:首页 > 其它

模板在二叉树和队列中的应用(借助队列广度遍历二叉树)

2013-10-07 20:07 441 查看
  接着这两三天的时间把模板、队列、链表、二叉树等知识又过了一遍。也亲自动手写了以上数据结构,算是把当年学数据结构时没做完的实验重新做了一遍,有点小小的成就感。因此写此博文以记之,以备以后用的时候查阅。

  模板和头文件的知识前面两篇博文已经大概交代了一下,以前没学模板的时候看到这东西头就大,现在学习了一下感觉模板对于代码的重用对提高开发效率还是很有帮助的。

  一、链表的实现:

#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()循环把当前队头节点的两个节点入队。所以循环一共循环非叶节点个数减一次,减一主要是根节点一开始就入队了。最后队列中就按层次的顺序排列了树的部分节点。注意不是全部节点都在队列中,入队和出队是动态的过程,不是一口气全部节点全部入队再出队。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: