二叉树基本功能的汇集(C++类实现)

二叉树是程序应用得比较多的一种结构。它可以反映物体之间的层次结构,还能通过孩子和双亲反映两物体之间某些特殊关系;排序二叉树还能帮助我们进行排序,并因此而提供快速的查找;二叉树基础上的伸展树能不断地优化我们系统的结构。并查集能很好地让我们进行分类;小根堆能帮助我们快速找到值最小的结点,它是优先队列的雏形。所有的这些都是以二叉树为基础的。

我实现的二叉树的基本功能包括前中后序的递归和非递归访问,求结点个数和叶子结点个数,还有求树高。这些是用C++类实现的。


BTree.h文件(类声明文件)

#ifndef BTREE_H
#define BTREE_H

struct BTreeNode
{
	int data;
	BTreeNode *lChild,*rChild;
};

class BTree
{public:
	void setRoot(BTreeNode* r){ root=r;}
	BTreeNode* getRoot(){ return root;}

	//中序遍历(递归)
	void inOrder();
	//中序遍历(非递归)
	void NotReInOrder();
	BTreeNode* createBTree();

	//前序遍历(递归)
	void preOrder();
	//前序遍历(非递归)
	void NotRePreOrder();

	//后序遍历(递归)
	void postOrder();
	
	//后序遍历(非递归)
	void NotRePostOrder();

	//求结点个数
	int BTreeSize();
	//求叶子结点个数
	int BTreeLeaves();

	//求树高
	int BTreeHeight();
	//层次法求树高
	int layerHeight();
	
protected:
	//中序遍历
	void inOrder(BTreeNode*);
	//前序遍历
	void preOrder(BTreeNode*);
	//后序遍历
	void postOrder(BTreeNode*);
	
	//结点个数
	int BTreeSize(BTreeNode*);
	//叶子结点
	int BTreeLeaves(BTreeNode*);

	//树高
	int BTreeHeight(BTreeNode*);
private:
	BTreeNode* root;
};

#endif




BTree.cpp(类的实现文件)


#include <iostream>
#include <stack>
#include <queue>
#include "BTree.h"
using namespace std;

//建立二叉树的算法
BTreeNode* BTree::createBTree()
{
	BTreeNode* current=0;
	int val=0;

	cin>>val;

	//-1的个数比数值的个数多1
	if(val==-1)
		return NULL;
	else
	{
		current=new BTreeNode;
		current->data=val;
		current->lChild=createBTree();
		current->rChild=createBTree();
		return current;
	}
	
}

//利用重载的方法
void BTree::inOrder()
{
	inOrder(root);
	cout<<endl;
}

//中序访问二叉树(递归)
void BTree::inOrder(BTreeNode* r)
{
	if(r!=0) //是if,而不是while
	{
		inOrder(r->lChild); //递归访问
		cout<<r->data<<" ";
		inOrder(r->rChild); //递归访问
	}
}

//中序遍历(非递归)
void BTree::NotReInOrder()
{
	stack<BTreeNode*> s;

	BTreeNode* r=getRoot();

	while(!s.empty()||r!=0)
	{
		while(r!=0)
		{
			s.push(r);
			r=r->lChild;
		}

		if(!s.empty())
		{
			r=s.top();
			s.pop();
			cout<<r->data<<" ";
			r=r->rChild;
		}
	}
}

//重载形式
void BTree::preOrder()
{
	preOrder(root);
	cout<<endl;
}

//前序递归访问二叉树(递归)
void BTree::preOrder(BTreeNode* r)
{
	if(r!=0) //是if,而不是while
	{
		cout<<r->data<<" ";
		preOrder(r->lChild); //递归访问
		preOrder(r->rChild); //递归访问
	}
}


//前序遍历(非递归)
void BTree::NotRePreOrder()
{
	stack<BTreeNode*> s;
	BTreeNode* r=getRoot();
	s.push(r);

	while(!s.empty())
	{
		r=s.top();
		s.pop();

		cout<<r->data<<" ";

		if(r->rChild!=0)
			s.push(r->rChild);
		if(r->lChild!=0)
			s.push(r->lChild);
	}
}


//重载形式
void BTree::postOrder()
{
	postOrder(root);
	cout<<endl;
}

//后序遍历(递归)
void BTree::postOrder(BTreeNode* r)
{
	if(r!=0) //是if,而不是while
	{
		postOrder(r->lChild); //递归访问
		postOrder(r->rChild); //递归访问
		cout<<r->data<<" ";
	}
}


//后序非递归访问要定义新的结构体类型
struct Node
{
	BTreeNode* tp;
	bool flag;
};

//后序遍历(非递归)
void BTree::NotRePostOrder()
{
	Node node; //定义Node结构体的一个结点
	stack<Node> s;

	BTreeNode* r=getRoot();
	while(!s.empty()||r!=0)
	{
		while(r!=0)
		{
			node.tp=r;
			node.flag=0;
			s.push(node);
			r=r->lChild;
		}

		if(!s.empty())
		{
			node=s.top();
			s.pop();
			r=node.tp; //将栈顶的BTreeNode*部分赋给r
			if(node.flag==1)
			{
				cout<<r->data<<" ";
				r=0; //表示已经访问了该结点
			}
			else
			{
				node.flag=1;
				s.push(node);
				r=r->rChild;
			}
		}
	}
}


//重载形式
int BTree::BTreeSize()
{
	return BTreeSize(root);
}

//求二叉树结点个数的函数
int BTree::BTreeSize(BTreeNode* r)
{
	//二叉树的结点个数为左右子树的高度之和再+1
	if(r==0) return 0; 
	else
		return 1+BTreeSize(r->lChild)+BTreeSize(r->rChild);
}

//重载形式
int BTree::BTreeLeaves()
{
	return BTreeLeaves(root);
}

//求二叉树叶子结点个数的函数
int BTree::BTreeLeaves(BTreeNode* r)
{
	//当为空时,返回0;当找到叶子时返回1
	if(r==0) return 0; 
	else
		if(r->lChild==0&&r->rChild==0)
			return 1;
	else
		return BTreeLeaves(r->lChild)+BTreeLeaves(r->rChild);
}

//重载形式
int BTree::BTreeHeight()
{
	return BTreeHeight(root);
}

//求二叉树高度的函数
int BTree::BTreeHeight(BTreeNode* r)
{
	if(r==0) return 0;
	else
	{
		//二叉树的高度为左右子树的最大者+1
		int lHei=BTreeHeight(r->lChild);
		int rHei=BTreeHeight(r->rChild);
		return (lHei>rHei) ? lHei+1:rHei+1;
	}
}



//层次遍历求树高需要利用的新结构
struct LayerBTreeNode
{
	BTreeNode* ptr;
	int height;
};

//层次遍历求高度
int BTree::layerHeight()
{
	queue<LayerBTreeNode> que;
	LayerBTreeNode temp,lTemp,rTemp; //牺牲空间来获得算法的清晰度

	BTreeNode* r=getRoot();

	int hei=1;
	temp.ptr=r;
	temp.height=1;
	que.push(temp); //先将根对应的LayerBTreeNode对象进队
	
	//不为空时
	while(!que.empty())
	{
		//BTreeNode* btreePtr=0;

		temp=que.front(); //取出队首元素
		que.pop();
		
		r=temp.ptr;

		//用当前的高度跟取出的队首进行比较
		if(hei<temp.height)
				hei=temp.height;

		if(r->lChild!=0||r->rChild!=0)
		{
			//如果它的左右子树不为空,则进队列
			if(r->lChild!=0)
			{
				lTemp.ptr=r->lChild;
				lTemp.height=temp.height+1; //在原来高度基础上加1,再入队列
				que.push(lTemp);
			}
			if(r->rChild!=0)
			{
				rTemp.ptr=r->rChild;
				rTemp.height=temp.height+1;
				que.push(rTemp);
			}

		}
	}
	return hei;
}






  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值