C++实现二叉树的顺序存储及三种递归遍历

文章目录

#include<iostream>
#include<stack>
#include<queue>
#include<string.h>
using namespace std;
#define MaxSize 101

class BinTree
{
    
    
	public:
		BinTree();
		void CreatTree();  //生成二叉树 
		void PreOrderTraverse1(int i=1);  //先序递归遍历 
		void InOrderTraverse1(int i=1);  //中序递归遍历
		void PostOrderTraverse1(int i=1); //后序递归遍历 
		void LevelOrder(); //层次遍历
		void Visit(int i); //输出第i个位置的数据 
		int Depth(int i=1);  //获得二叉树深度
		int NodeCount(int i=1);   //获得结点个数
		int LeafCount(int i=1);   //获得叶子结点个数 
		~BinTree();
		
	private:
		int* list; //结点存储的数据为整形数 
		int size;  //记录结点的个数 
};

BinTree::BinTree()
{
    
    
	list = new int[MaxSize];
	memset(list,0,MaxSize);
}

void BinTree::CreatTree()  //生成二叉树 
{
    
    
    int n = 0;
	cout << "请输入结点个数:";
	cin >> n;
	if(n<=0)
	{
    
    
		cout << "结点数不能小于1" << endl;
		return;
	}
	while(n>MaxSize)
	{
    
    
		cout << "最大结点数为:" << MaxSize << endl;
		cout << "请输入结点个数:";
		cin >> n; 
	}
	size = n;
	cout << "请输入每个结点的数据:"; 
	for(int i=0; i<n; ++i)
	{
    
    
		cin >> list[i];
	}
}

void BinTree::PreOrderTraverse1(int i)  //先序递归遍历
{
    
    
	if(!size)
	{
    
    
		return;
	}
	else
	{
    
    
		if(list[i-1]!=0)
		{
    
    
			Visit(i);
			PreOrderTraverse1(2*i);
			PreOrderTraverse1(2*i+1);
		}
		else
		{
    
    
			return;
		}
	}
}

void BinTree::InOrderTraverse1(int i)  //中序递归遍历 
{
    
    
	if(!size)
	{
    
    
		return;
	}
	else
	{
    
    
		if(list[i-1]!=0)
		{
    
    
			InOrderTraverse1(2*i);
		    Visit(i);
		    InOrderTraverse1(2*i+1);
		}
		else
		{
    
    
			return;
		}
	}
}

void BinTree::PostOrderTraverse1(int i)  //后序递归遍历 
{
    
    
	if(!size)
	{
    
    
		return;
	}
	else
	{
    
    
		if(list[i-1]!=0)
		{
    
    
			PostOrderTraverse1(2*i);
			PostOrderTraverse1(2*i+1);
			Visit(i);
		}
		else
		{
    
    
			return;
		}
	}
}

void BinTree::LevelOrder()  //层次遍历 
{
    
    
	if(!size)
	{
    
    
		return;
	}
	else
	{
    
    
		queue<int> q;
		int i = 1;
		q.push(i);
		while(!q.empty())
		{
    
    
			if(list[q.front()-1]!=0) //如果队头结点的数据域不为0,说明该结点在二叉树中 
			{
    
    
				i = q.front();
				q.push(2*i);
				q.push(2*i+1); //将队头结点的左右结点入队 
				Visit(i);
				q.pop();
			}
			else
			{
    
    
				q.pop();
			}
		}
	}	
}

void BinTree::Visit(int i)  //输出第i个位置的数据 
{
    
    
	if(list[i-1]!=0)
	{
    
    
		cout << list[i-1] << " ";
	}
}

int BinTree::Depth(int i)  //获得二叉树深度
{
    
    
	if(!size)
	{
    
    
		return 0;
	}
	else
	{
    
    
		if(list[i-1]==0)
		{
    
    
			return 0;
		}
		else
		{
    
    
			int m = Depth(2*i);
			int n = Depth(2*i+1);
			return m>n?(m+1):(n+1); 
		}
	}
}

int BinTree::NodeCount(int i)  //获得结点个数
{
    
    
	if(!size)
	{
    
    
		return 0;
	}
	else
	{
    
    
		if(list[i-1]==0)
		{
    
    
			return 0;
		}
		else
		{
    
    
			return NodeCount(2*i) + NodeCount(2*i+1) + 1; //返回左子树的结点个数+右子树的结点个数+1 
		}
	}
}

int BinTree::LeafCount(int i)  //获得叶子结点个数
{
    
    
	if(!size)
	{
    
    
		return 0;
	}
	else
	{
    
    
		if(list[2*i-1]==0&&list[2*i]==0)
		{
    
    
			return 1;
		}
		else
		{
    
    
			if(list[2*i-1]!=0&&list[2*i]==0)
			{
    
    
				return LeafCount(2*i);
			}
			else if(list[2*i]!=0&&list[2*i-1]==0)
			{
    
    
				return LeafCount(2*i+1);
			}
			else
			{
    
    
				return LeafCount(2*i) + LeafCount(2*i+1);
			}
		}
	}
}

BinTree::~BinTree()
{
    
    
	delete[] list;
}

int main()
{
    
    
	BinTree bt;
	bt.CreatTree();
	cout << "先序递归遍历:";bt.PreOrderTraverse1();
	cout << endl;
	cout << "中序递归遍历:";bt.InOrderTraverse1();
	cout << endl;
	cout << "后序递归遍历:";bt.PostOrderTraverse1();
	cout << endl;
	cout << "层次遍历:";bt.LevelOrder();
	cout << endl;
	cout << "深度:" << bt.Depth();
	cout << endl;
	cout << "叶子结点数:" <<  bt.LeafCount();
	cout << endl;
	cout << "结点数:" <<  bt.NodeCount();
	cout << endl;
}

测试结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46027243/article/details/113848705