二叉树

1.各种不同的遍历函数、求二叉树的高度函数、求二叉树所有结点函数、求二叉树所有叶子结点函数的算法设计。

代码如下(示例):

#include<iostream>
using namespace std;
#define max 16 
template <typename T>
struct biNode{
	biNode<T> *lChild,*rChild;
	T data;
}; 
template <typename T>
class biTree{
	biNode<T> *root;
public:
	biTree(){
		char ch;
		cin>>ch;
		biNode<T> *Q[max];
		biNode<T> *s;
		int rear=0,front=1;
		root=NULL;
		while(ch!='#'){
			s=NULL;
			if(ch!='@'){
				s=new biNode<T>;
				s->data=ch;
				s->lChild=s->rChild=NULL;
			}
			Q[++rear]=s;
			if(rear==1) root=s;
			else{if(s){
				        if(rear%2==0) Q[front]->lChild=s;
			          	else Q[front]->rChild=s;
			}
			if(rear%2) front++;}
			cin>>ch;
		}
	}
	void preOrder(biNode<T> *rt){
	if(rt){
		cout<<rt->data;
		preOrder(rt->lChild);
		preOrder(rt->rChild);
	}
}
	void inOrder(biNode<T> *rt){
	if(rt){
		preOrder(rt->lChild);
		cout<<rt->data;
		preOrder(rt->rChild);
	   }
	}
	void postOrder(biNode<T> *rt){
	if(rt){
		preOrder(rt->lChild);
		preOrder(rt->rChild);
		cout<<rt->data;
	}
}
	void levelOrder(){
		int front=-1,rear=-1;
		biNode<T> *Q[max];
		if(root) Q[++rear]=root;
		while(front!=rear){
			biNode<T> *s=Q[++front];
			cout<<s->data<<" ";
			if(s->lChild) Q[++rear]=s->lChild;
			if(s->rChild) Q[++rear]=s->rChild;
		}
		cout<<endl;
	}
   int high(biNode<T> *rt){
   	    if(rt==0) return 0;
   	    else{
   	    	int lh,rh;
   	    	lh=high(rt->lChild);
   	    	rh=high(rt->rChild);
   	    	return 1+(lh>rh?lh:rh);
		   }
   }
   int numAllLeaf(biNode<T> *rt){
   	if(rt==0) return 0;
   	else if(rt->lChild==NULL&&rt->rChild==NULL) return 1;
   	     else {
   	     	return numAllLeaf(rt->lChild)+numAllLeaf(rt->rChild);
			}
   }
   int numAllNode(biNode<T> *rt){
   	if(rt==0) return 0;
	else return 1+numAllNode(rt->lChild)+numAllNode(rt->rChild);
   }
   void deTree(biNode<T> *rt){
   	if(rt){
   	    deTree(rt->lChild);
		deTree(rt->rChild);
		delete rt;
	   }
   }
   ~biTree(){ deTree(root);}
   	biNode<T> *getRoot(){
	    return root;
	}
};
int main(){
	biTree<char> b1;
	cout<<"先序遍历序列:";
	b1.preOrder(b1.getRoot());
	cout<<'\n';
	cout<<"中序遍历序列:";
	b1.inOrder(b1.getRoot());
	cout<<'\n';
	cout<<"后序遍历序列:";
	b1.postOrder(b1.getRoot());
	cout<<'\n';
	cout<<"层序遍历序列:";
	b1.levelOrder();
	cout<<"二叉树高度为:"<<b1.high(b1.getRoot())<<endl;
	cout<<"二叉树所有叶子结点个数为:"<<b1.numAllLeaf(b1.getRoot())<<endl;
	cout<<"二叉树所有结点个数为:"<<b1.numAllNode(b1.getRoot())<<endl;
	return 0;
} 

总结

1.数据成员指针root是私有访问权限,不能在类外被访问。然而,在主函数做测试时,又需要用到root来做实参,因此,需要在类中定义一个函数来返回指针root。
2.在写析构函数时,由于析构函数不能有参数,而刚好又需要用到递归的方法来实现,因此,
需要先写一个递归函数。然后再在析构函数体内来调用这个递归函数,以实现功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值