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

文章目录

#include<iostream>
#include<queue>
#include<stack>
using namespace std;
#define MaxSize 100

typedef struct TreeNode
{
    
    
	int data;
	TreeNode* left;
	TreeNode* right;
	TreeNode()
	{
    
    
		data = 0;  //数据域 
		left = NULL;
		right = NULL;
	}
}TreeNode, *TN;

class BinTree
{
    
    
	public:
		BinTree();
		TN CreatTree(TN node); //创建二叉树 
		TN GetRoot();
		void PreOrderTraverse1(TN node);  //先序递归遍历
		void InOrderTraverse1(TN node);  //中序递归遍历
		void PostOrderTraverse1(TN node); //后序递归遍历
		void LevelOrder(TN node); //层次遍历
		void Visit(TN node); //输出指定结点的数据 
		int Depth(TN node);  //获得二叉树深度
		int NodeCount(TN node);   //获得结点个数
		int LeafCount(TN node);   //获得叶子结点个数 
		void Destroy(TN node);  //销毁二叉树 
	private:
		TreeNode* root;	
};

BinTree::BinTree()
{
    
    	
	root = new TreeNode(); 
	root->data = 0;
	root->left = NULL;
	root->right = NULL;
} 

TN BinTree::CreatTree(TN node)  //创建二叉树 
{
    
    
	cout << "请输入结点的数据域,当输入为 0 时代表当前位置无结点:";
	TN t = node;
	int data = 0;
	cin >> data;
	if(data>0)
	{
    
    
		if(t!=root)
		{
    
    
			t = new TreeNode();
		}
		t->data = data;
		t->left = CreatTree(t->left);
		t->right = CreatTree(t->right);
		return t;
	}
    else
	{
    
    
		return NULL;
	}
}

TN BinTree::GetRoot()
{
    
    
	return root;
} 

void BinTree::PreOrderTraverse1(TN node)  //先序递归遍历
{
    
    
	if(!node)
	{
    
    
		return;
	}
	else
	{
    
    
		Visit(node);
		PreOrderTraverse1(node->left);
		PreOrderTraverse1(node->right);
	}
}

void BinTree::InOrderTraverse1(TN node)  //中序递归遍历 
{
    
    
	if(!node)
	{
    
    
		return;
	}
	else
	{
    
    
		InOrderTraverse1(node->left);
		Visit(node);
		InOrderTraverse1(node->right);
	}
}

void BinTree::PostOrderTraverse1(TN node)  //后序递归遍历 
{
    
    
	if(!node)
	{
    
    
		return;
	}
	else
	{
    
    
		PostOrderTraverse1(node->left);
		PostOrderTraverse1(node->right);
		Visit(node);
	}
}

void BinTree::LevelOrder(TN node)  //层次遍历
{
    
    
	if(!node)
	{
    
    
		return;
	}
	else
	{
    
    
		TN p = node;
		queue<TN> q;
	    q.push(p);
		while(!q.empty())
		{
    
    
			p = q.front();
			if(p->left)
			{
    
    
				q.push(p->left);
			}
			if(p->right)
			{
    
    
				q.push(p->right);
			}
			Visit(q.front());
			q.pop();
		}
	}
}

void BinTree::Visit(TN node)  //输出指定结点的数据 
{
    
    
	if(node)
	{
    
    
		cout << node->data << " ";
	}
	else
	{
    
    
		cout << "结点为空";
	}
}

int BinTree::Depth(TN node)  //获得二叉树深度
{
    
    
	if(!node)
	{
    
    
		return 0;
	}
	else
	{
    
    
		int m = Depth(node->left);
		int n = Depth(node->right);
		return m>n?(m+1):(n+1);
	}
}

int BinTree::NodeCount(TN node)  //获得结点个数
{
    
    
	if(!node)
	{
    
    
		return 0;
	}
	else
	{
    
    
		return NodeCount(node->left) + NodeCount(node->right) + 1;
	}
}

int BinTree::LeafCount(TN node)  //获得叶子结点个数
{
    
    
	if(!node)
	{
    
    
		return 0;
	}
	else
	{
    
    
		if(node->left==NULL&&node->right==NULL)
		{
    
    
			return 1;
		}
		else
		{
    
    
			return LeafCount(node->left) + LeafCount(node->right);
		}
	}
}

void BinTree::Destroy(TN node)
{
    
    
	if(!node)
	{
    
    
		return;
	}
	else
	{
    
    
		Destroy(node->left);
		Destroy(node->right);
		delete node;
	}
}

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

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

猜你喜欢

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