加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

【数据结构】二叉树的简单遍历及基本操作

发布时间:2020-12-15 05:57:19 所属栏目:安全 来源:网络整理
导读:1、构造 2、拷贝构造 3、析构 4.深度 5、叶子数 6.前序遍历递归非递归 7、中序遍历递归非递归 8、中序遍历递归非递归 9、第k层子树 等 定义树节点结构体 struct BinTreeNode{BinTreeNode* left;BinTreeNode* right;T _date;BinTreeNode(const T x):left(NULL

1、构造

2、拷贝构造

3、析构

4.深度

5、叶子数

6.前序遍历递归非递归

7、中序遍历递归非递归

8、中序遍历递归非递归

9、第k层子树

定义树节点结构体

struct BinTreeNode
{
	BinTreeNode* left;
	BinTreeNode* right;
	T _date;
	BinTreeNode(const T& x)
		:left(NULL),right(NULL),_date(x)
	{}
};


内部函数实现

	void _CreateTree(Node*& root,T a[],size_t size,int& index,const T& invalid)
	{

		if(index< size&& a[index]!=invalid)
		{
			root=new Node(a[index]);
			_CreateTree(root->left,a,size,++index,invalid);
			_CreateTree(root->right,invalid);

		}
	}
	Node*  _CopyBinTree(Node* root)
	{
		Node* newNode=NULL;
		if(!root)
		{
        newNode=new Node(root->_date);
		newNode->left=_CopyBinTree(root->left);
		newNode->right=_CopyBinTree(root->right);
		}
		return newNode;
	}
	void  _Destory(Node* root)
	{
		if(root==NULL)
			return;
		_Destory(root->left);
		_Destory(root->right);
		delete root;
	}
	void  _PrevOrder(Node* root)
	{
		if(root==NULL)
			return;
        cout<<root->_date<<" ";
		_PrevOrder(root->left);
		_PrevOrder(root->right);
		
	}
	void  _InOrder(Node* root)
	{
		if(root==NULL)
			return;
		_InOrder(root->left);
         cout<<root->_date<<" ";
		_InOrder(root->right);
		
	}
	void  _PostOrder(Node* root)
	{
		if(!root)
			return;
		_PostOrder(root->left);
		_PostOrder(root->right);
		cout<<root->_date<<" ";
	}
	int _Size(Node* root)
	{

		if (!root)
		return 0;
		return _Size(root->left)+_Size(root->right)+1;
	}
	int _Depth(Node* root)
	{
		if(!root)
			return 0;
		int leftchilddepth=_Depth(root->left)+1;
		int rightchilddepth=_Depth(root->right)+1;
		if(leftchilddepth>=rightchilddepth)
		{
			return leftchilddepth;
		}
		else
		{
			return rightchilddepth;
		}
	}
	int _GetKLevel(Node* root,size_t k)
	{
if(root==NULL)
	return 0;
if(k==1)
	return 1;
else 
	return _GetKLevel(root->left,k-1)+_GetKLevel(root->right,k-1);
	}
	int _LeafSize(Node* root)
	{
		if(root==NULL)
			return 0;
		if(root->left==NULL&&root->right==NULL)
			return 1;
		return _LeafSize(root->left)+_LeafSize(root->right);
	}
外部实现调用内部函数
	BinTree(T* a,const T& invalid)//构造
	{
	int index=0;
	_CreateTree( _root,index,invalid);
	}
	BinTree(const BinTree<T>& t)//拷贝构造
	{
		_root=_CopyBinTree(t._root);

	}
	BinTree<T>& operator=(const BinTree<T> &t)//运算符重载
	{
		if(this!=&t)
		{
			swap(_root=t._root);
		}
		return *this;
	}
	void PrevOrder()//递归前序
	{
		_PrevOrder(_root);
		cout<<endl;
	}
	void InOrder()
	{
		_InOrder(_root);
		cout<<endl;
	}
	void PostOrder()
	{
		_PostOrder(_root);
		cout<<endl;
	}
	void LevelOrder()///层序
	{
		queue<Node*> q;
		Node* cur=_root;
		if(cur)
			q.push(cur);
		while (!q.empty())
		{
			cur=q.front();
			cout<<cur->_date<<" ";
			if(cur->left)
			{
				q.push(cur->left);
			}
			if(cur->right)
			{
				q.push(cur->right);
			}
			q.pop();
		}
		cout<<endl;
	}
	void PrevOrder_NonR()//非递归前序
	{
		stack<Node*> sn;
		if(_root)
		{
			sn.push(_root);
		}
		while (sn.empty()==NULL)
		{
			Node* root=sn.top();
			cout<<root->_date<<" ";
			sn.pop();
			if (root->left)
			{
				sn.push(root->left);
			}
		    if (root->right)
			{
				sn.push(root->right);
			}
		}
		cout<<endl;
	}
	void InOrder_NonR()
	{
		stack<Node*> sn;
		Node* cur=_root;
		while (cur||!sn.empty())
		{
			while (cur)
			{
				sn.push(cur);
				cur=cur->left;
			}
			if (!sn.empty())
			{
				Node* tmp=sn.top();
				cout<<tmp->_date<<" ";
				sn.pop();
				cur=tmp->right;
			}
		}
		cout<<endl;
	}
	void PostOrder_NonR() 
	{
		stack<Node*> s;
		Node *cur; 
		Node *pre=NULL; 
		s.push(_root);
		while(!s.empty())
		{
			cur=s.top();
			if((cur->left==NULL&&cur->right==NULL)||
				(pre!=NULL&&(pre==cur->left||pre==cur->right)))
			{
				cout<<cur->_date<<" "; 
				s.pop();
				pre=cur; 
			}
			else
			{
				if(cur->right!=NULL)
					s.push(cur->right);
				if(cur->left!=NULL) 
					s.push(cur->left);
			}
		} 
		cout<<endl;
	}
	size_t Size()
	{
		return _Size(_root);
		
	}
	size_t Depth()
	{
		return _Depth(_root);
	}
	size_t LeafSize()
	{
		return _LeafSize(_root);
	}
	size_t GetKLevel(size_t k)
	{
		return _GetKLevel(_root,k);
	}
	void Destory()
	{
		_Destory(_root);
	}
测试用例
void test()
{
	int a1[10]={1,2,3,'#',4,5,6};
	BinTree<int> t1(a1,10,'#');
	t1.PrevOrder();
	t1.InOrder();
	t1.PostOrder();
	t1.PrevOrder_NonR();
	t1.InOrder_NonR();
	t1.PostOrder_NonR();
	t1.LevelOrder();
	cout<<t1.Size()<<endl;
	cout<<t1.Depth()<<endl;
	cout<<t1.LeafSize()<<endl;
	cout<<t1.GetKLevel(2);
}
源码
#include <iostream>
#include <cstdlib>
#include <assert.h>
#include <stack>
#include<queue>
using namespace std;
template<typename T>
struct BinTreeNode
{
	BinTreeNode* left;
	BinTreeNode* right;
	T _date;
	BinTreeNode(const T& x)
		:left(NULL),_date(x)
	{}
};
template<typename T>
class BinTree
{
	typedef BinTreeNode<T> Node;
public:
	BinTree()
		:_root(NULL)
	{}
	~BinTree()
	{
		Destory();
	}
	BinTree(T* a,const T& invalid)
	{
	int index=0;
	_CreateTree( _root,invalid);
	}
	BinTree(const BinTree<T>& t)
	{
		_root=_CopyBinTree(t._root);

	}
	BinTree<T>& operator=(const BinTree<T> &t)
	{
		if(this!=&t)
		{
			swap(_root=t._root);
		}
		return *this;
	}
	void PrevOrder()
	{
		_PrevOrder(_root);
		cout<<endl;
	}
	void InOrder()
	{
		_InOrder(_root);
		cout<<endl;
	}
	void PostOrder()
	{
		_PostOrder(_root);
		cout<<endl;
	}
	void LevelOrder()
	{
		queue<Node*> q;
		Node* cur=_root;
		if(cur)
			q.push(cur);
		while (!q.empty())
		{
			cur=q.front();
			cout<<cur->_date<<" ";
			if(cur->left)
			{
				q.push(cur->left);
			}
			if(cur->right)
			{
				q.push(cur->right);
			}
			q.pop();
		}
		cout<<endl;
	}
	void PrevOrder_NonR()
	{
		stack<Node*> sn;
		if(_root)
		{
			sn.push(_root);
		}
		while (sn.empty()==NULL)
		{
			Node* root=sn.top();
			cout<<root->_date<<" ";
			sn.pop();
			if (root->left)
			{
				sn.push(root->left);
			}
		    if (root->right)
			{
				sn.push(root->right);
			}
		}
		cout<<endl;
	}
	void InOrder_NonR()
	{
		stack<Node*> sn;
		Node* cur=_root;
		while (cur||!sn.empty())
		{
			while (cur)
			{
				sn.push(cur);
				cur=cur->left;
			}
			if (!sn.empty())
			{
				Node* tmp=sn.top();
				cout<<tmp->_date<<" ";
				sn.pop();
				cur=tmp->right;
			}
		}
		cout<<endl;
	}
	void PostOrder_NonR() 
	{
		stack<Node*> s;
		Node *cur; 
		Node *pre=NULL; 
		s.push(_root);
		while(!s.empty())
		{
			cur=s.top();
			if((cur->left==NULL&&cur->right==NULL)||
				(pre!=NULL&&(pre==cur->left||pre==cur->right)))
			{
				cout<<cur->_date<<" "; 
				s.pop();
				pre=cur; 
			}
			else
			{
				if(cur->right!=NULL)
					s.push(cur->right);
				if(cur->left!=NULL) 
					s.push(cur->left);
			}
		} 
		cout<<endl;
	}
	size_t Size()
	{
		return _Size(_root);
		
	}
	size_t Depth()
	{
		return _Depth(_root);
	}
	size_t LeafSize()
	{
		return _LeafSize(_root);
	}
	size_t GetKLevel(size_t k)
	{
		return _GetKLevel(_root,k);
	}
	void Destory()
	{
		_Destory(_root);
	}
protected:
	void _CreateTree(Node*& root,invalid);

		}
	}
	Node*  _CopyBinTree(Node* root)
	{
		Node* newNode=NULL;
		if(!root)
		{
        newNode=new Node(root->_date);
		newNode->left=_CopyBinTree(root->left);
		newNode->right=_CopyBinTree(root->right);
		}
		return newNode;
	}
	void  _Destory(Node* root)
	{
		if(!root)
			return;
		_Destory(root->left);
		_Destory(root->right);
		delete root;
	}
	void  _PrevOrder(Node* root)
	{
		if(root==NULL)
			return;
        cout<<root->_date<<" ";
		_PrevOrder(root->left);
		_PrevOrder(root->right);
		
	}
	void  _InOrder(Node* root)
	{
		if(root==NULL)
			return;
		_InOrder(root->left);
         cout<<root->_date<<" ";
		_InOrder(root->right);
		
	}
	void  _PostOrder(Node* root)
	{
		if(!root)
			return;
		_PostOrder(root->left);
		_PostOrder(root->right);
		cout<<root->_date<<" ";
	}
	int _Size(Node* root)
	{

		if (!root)
		return 0;
		return _Size(root->left)+_Size(root->right)+1;
	}
	int _Depth(Node* root)
	{
		if(!root)
			return 0;
		int leftchilddepth=_Depth(root->left)+1;
		int rightchilddepth=_Depth(root->right)+1;
		if(leftchilddepth>=rightchilddepth)
		{
			return leftchilddepth;
		}
		else
		{
			return rightchilddepth;
		}
	}
	int _GetKLevel(Node* root,k-1);
	}
	int _LeafSize(Node* root)
	{
		if(root==NULL)
			return 0;
		if(root->left==NULL&&root->right==NULL)
			return 1;
		return _LeafSize(root->left)+_LeafSize(root->right);
	}
	Node* _root;
};
void test()
{
	int a1[10]={1,'#');
	t1.PrevOrder();
	t1.InOrder();
	t1.PostOrder();
	t1.PrevOrder_NonR();
	t1.InOrder_NonR();
	t1.PostOrder_NonR();
	t1.LevelOrder();
	cout<<t1.Size()<<endl;
	cout<<t1.Depth()<<endl;
	cout<<t1.LeafSize()<<endl;
	cout<<t1.GetKLevel(2);
}
<pre name="code" class="cpp">void test2()
{
   int array1[10] = { 1,6 };
   BinTree<int> tree(array1,'#');
  BinTree<int> tree1=tree;//拷贝
   tree1.PrevOrder();
 

}


 

主函数
#include "BinTree.h"
int main()
{
<span style="white-space:pre">	</span>test();
<span style="white-space:pre">	</span>test2();
<span style="white-space:pre">	</span>system("pause");
<span style="white-space:pre">	</span>return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读