二叉树递归与非递归遍历实现

二叉树:将一数组创建二叉树,四种遍历方法:前序,中序,后序,层次遍历,与求不同情况下的结点个数等。

代码实现:

#include <iostream>
#include <cstdlib>
#include <assert.h>
#include <queue>
#include <stack>
using namespace std;

template <class T>
struct BinaryTreeNode
{
	T _data;
	BinaryTreeNode<T> *_left;
	BinaryTreeNode<T> *_right;
	BinaryTreeNode(const T& x)
		:_data(x)
		,_left(NULL)
		,_right(NULL)
	{}
};

template <class T>
class BinaryTree
{
	typedef BinaryTreeNode<T> Node;
public:
	BinaryTree(T* a,size_t size,const T& invalid=T())
	{
		assert(a);
		size_t index=0;
		_root=_CreateTree(a,size,invalid,index);  //递归创建二叉树
	}

	BinaryTree()
		:_root(NULL)
	{}

	BinaryTree(const BinaryTree<T>& t)
	{
		_root=_Copy(t._root);
	}

	BinaryTree<T>& operator=(BinaryTree<T>& t)
	{
		if(this!=&t)
		{
			Node* tmp=_Copy(t._root);
			_root=_Destroy(_root);
			_root=tmp;
		}
		return *this;
	}
	~BinaryTree()
	{
		_root=_Destroy(_root);
	}
	
	void PrevOrder() //递归前序遍历
	{
		_PrevOrder(_root);
		cout<<endl;
	}

	void PrevOrderNonR()  //非递归实现前序
	{
		assert(_root);
		stack<Node*> s;
		Node* cur=_root;
		while(!s.empty()||cur)
		{
			while(cur)
			{
				cout<<cur->_data<<" ";
				s.push(cur);
				cur=cur->_left;
			}
			Node* top=s.top();
			s.pop();
			cur=top->_right;
		}
		cout<<endl;
	}

	void InOrder()  //递归中序遍历
	{
		_InOrder(_root);
		cout<<endl;
	}

	void InOrderNonR()  //非递归实现中序
	{
		assert(_root);
		stack<Node*> s;
		Node* cur=_root;
		while(!s.empty()||cur)
		{
			while(cur)
			{
				s.push(cur);
				cur=cur->_left;
			}
			Node* top=s.top();
			cout<<top->_data<<" ";
			s.pop();
			cur=top->_right;
		}
		cout<<endl;
	}

	void PostOrder()  //递归后序遍历
	{
		_PostOrder(_root);
		cout<<endl;
	}

	void PostOrderNonR()  //非递归实现后序
	{
		assert(_root);
		stack<Node*> s;
		Node* cur=_root;
		Node* prev=NULL;
		while(!s.empty()||cur)
		{
			while(cur)
			{
				s.push(cur);
				cur=cur->_left;
			}
			Node* top=s.top();
			if(top->_right==NULL||top->_right==prev)
			{
				cout<<top->_data<<" ";
			    s.pop();
				prev=top;
			}
			else
			{
				cur=top->_right;
			}
		}
		cout<<endl;
	}

	void LevlOrder()  //非递归层次遍历
	{
		_LevOrder(_root);
		cout<<endl;
	}

	size_t Size() //求结点个数
	{
		size_t size=0;
		_Size(_root,size);
		return size;
	}

	size_t Depth()  //求深度
	{
		return _Depth(_root);
	}

	size_t GetLeafSize()  //求叶子结点个数
	{
		size_t size=0;
		_GetLeafSize(_root,size);
		return size;
	}

	size_t GetKLevelSize(size_t k)  //求K层结点个数
	{
		size_t count=0;
		size_t level=1;
	    _GetKLevelSize(_root,k,count,level);
		return count;
	}

	Node* Find(const T& x )  //寻找某一个结点
	{
		return _find(_root,x);
	}

protected:
	Node* _find(Node* root,const T& x)
	{
		if(root==NULL)
			return NULL;
		if(root->_data==x)
			return root;
		Node* tmp=find(root->_left,x);
		if(tmp==NULL)
		{
			tmp=find(root->_right,x);
		}
		return tmp;
	}

	void _GetKLevelSize(Node* root,size_t k,size_t& count,size_t level)
	{
		if(root==NULL)
			return;
		if(level==k)
		{
			++count;
			return;
		}
		_GetKLevelSize(root->_left,k,count,level+1);
		_GetKLevelSize(root->_right,k,count,level+1);
	}

	void _GetLeafSize(Node* root,size_t& size)
	{
		if(root!=NULL)
		{
			if(root->_left==NULL&&root->_right==NULL)
			{
				++size;
				return;
			}
			_GetLeafSize(root->_left,size);
			_GetLeafSize(root->_right,size);
		}
	}

	size_t _Depth(Node* root)
	{
		if(root==NULL)
		{
			return 0;
		}
		size_t leftcount=_Depth(root->_left)+1;
		size_t rightcount=_Depth(root->_right)+1;
		return leftcount>rightcount?leftcount:rightcount;
	}

	void _Size(Node* root,size_t& size)
	{
		if(root!=NULL)
		{
			++size;
			_Size(root->_left,size);
			_Size(root->_right,size);
		}
	}

	void _LevOrder(Node* root)
	{
		queue<Node*> q;
		q.push(root);
		while(!q.empty())
		{
			Node* tmp=q.front();
			cout<<tmp->_data<<" ";
			q.pop();
			if(tmp->_left!=NULL)
			{
				q.push(tmp->_left);
			}
			if(tmp->_right!=NULL)
			{
				q.push(tmp->_right);
			}
		}
	}

	void _InOrder(Node* root)
	{
		if(root!=NULL)
		{
			_InOrder(root->_left);
			cout<<root->_data<<" ";
			_InOrder(root->_right);
		}
	}

	void _PostOrder(Node* root)
	{
		if(root!=NULL)
		{
			_PostOrder(root->_left);
			_PostOrder(root->_right);
			cout<<root->_data<<" ";
		}
	}

	void _PrevOrder(Node* root)
	{
		if(root!=NULL)
		{
			cout<<root->_data<<" ";
			_PrevOrder(root->_left);
			_PrevOrder(root->_right);
		}
	}

	Node* _CreateTree(T* a,size_t size,const T& invalid,size_t& index)
	{
		Node* NewNode=NULL;
		if(index<size&&a[index]!=invalid)
		{
			NewNode=new Node(a[index]);
			NewNode->_left=_CreateTree(a,size,invalid,++index);
			NewNode->_right=_CreateTree(a,size,invalid,++index);
		}
		return NewNode;
	}

	Node* _Copy(Node* root)
	{
		Node* NewNode=NULL;
		if(root!=NULL)
		{
			NewNode=new Node(root->_data);
			NewNode->_left=_Copy(root->_left);
			NewNode->_right=_Copy(root->_right);
		}
		return NewNode;
	}

	Node* _Destroy(Node* root)
	{
		if(root!=NULL)
		{
			root->_left=_Destroy(root->_left);
			root->_right=_Destroy(root->_right);
			delete root;
			root=NULL;
		}
		return root;
	}
protected:
	Node *_root;
};
void TestBinaryTree()
{
	/*int a[10]={1,2,3,'#','#',4,'#','#',5,6};
	BinaryTree<int> t1(a,sizeof(a)/sizeof a[0],'#');
	BinaryTree<int> t2=t1;
	t2.PrevOrder();
	t2.InOrder();
	t2.PostOrder();
	t2.LevlOrder();
	cout<<"深度:"<<t2.Depth()<<endl;
	cout<<"结点个数:"<<t2.Size()<<endl;
	cout<<"叶子结点个数:"<<t2.GetLeafSize()<<endl;
	cout<<"层数结点个数:"<<t2.GetKLevelSize(2)<<endl;
	cout<<endl<<endl;
*/
	int a1[]={1,2,'#',3,'#','#',4,5,'#',6,'#',7,'#','#',8};
	BinaryTree<int> t3(a1,sizeof(a1)/sizeof a1[0],'#');
	BinaryTree<int> t4;
	t4=t3;
	t4.PrevOrder();
	t4.PrevOrderNonR();
	t4.InOrder();
	t4.InOrderNonR();
	t4.PostOrder();
	t4.PostOrderNonR();
	t4.LevlOrder();
	cout<<"深度:"<<t4.Depth()<<endl;
	cout<<"结点个数:"<<t4.Size()<<endl;
	cout<<"叶子结点个数:"<<t4.GetLeafSize()<<endl;
	cout<<"层数结点个数:"<<t4.GetKLevelSize(3)<<endl;
}

int main()
{
	TestBinaryTree();
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值