树的完整实现--遍历--应用

本文介绍了一种使用C++模板实现的二叉树数据结构,包括创建、先序、中序、后序及层序遍历等基本操作,并提供了节点数量统计和树深度计算的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       下面是一颗二叉树的建立,以及其遍历算法,深度,数目等问题的求解

#pragma once
#include<iostream>
#include<queue>
using namespace std;

template<class Type>
class Tree;

//树节点
template<class Type>
class TreeNode
{ 
	friend class Tree<Type>;  //友元类
public:
	TreeNode() 
		:data(Type())
		, firstchild(NULL)
		, nextsibling(NULL)		
	{}

	TreeNode(Type d, TreeNode* L = NULL, TreeNode* C = NULL) 
		:data(d)
		,firstchild(C)
		,nextsibling(L)		
	{}

	~TreeNode()
	{}

private:
	Type				data;
	TreeNode<Type>	*firstchild;
	TreeNode<Type>	*nextsibling;
};

template<class Type>
class Tree
{
public:
	Tree(Type Ref) 
		:Refvalue(Ref)
		, root(NULL)
	{}

public:
	void create()
	{ // 创建二叉树
		create(root);
	}

	void PreOrder()
	{ // 先序遍历二叉树
		cout << "PreOder:";
		PreOrder(root);
		cout << endl;
	}

	void InOrder()
	{// 中序遍历二叉树
		cout << "InOrder:";
		InOrder(root);
		cout << endl;
	}

	void PostOrder()
	{ // 后续遍历二叉树
		cout << "PostOder:";
		PostOrder(root);
		cout << endl;
	}
	
	void LevelOrder()
	{  // 层序遍历二叉树
		cout << "LevelOder:";
		LevelOrder(root);
		cout << endl;
	}
	
	void TreeNodeNum()
	{ //树节点数目
		cout << "TreeNode:";
		cout << TreeNodeNum(root) << endl;
	}
	
	void DeepTree()
	{ // 二叉树的深度
		cout << "TreeDeep:";
		cout << DeepTree(root) << endl;
	}

protected:
	//内部函数
	void create(TreeNode<Type>*& t)
	{
		Type item;
		cin >> item;
		if (item == Refvalue)
		{
			t = NULL;
			return;
		}
		else
		{
			t = new TreeNode<Type>(item);
			create(t->firstchild);
			create(t->nextsibling);
		}
	}

	bool empty()
	{
		return root == NULL;
	}

	void PreOrder(TreeNode<Type>*& t)
	{
		if (t == NULL)
		{
			return;
		}
		else
		{
			cout << t->data << " ";
			PreOrder(t->firstchild);
			PreOrder(t->nextsibling);
		}
	}
	
	void InOrder(TreeNode<Type>*& t)
	{
		if (t == NULL)
		{
			return;
		}
		else
		{
			InOrder(t->firstchild);
			cout << t->data << " "; 
			InOrder(t->nextsibling);
		}
	}

	void PostOrder(TreeNode<Type>*& t)
	{
		if (t == NULL)
		{
			return;
		}
		else
		{
			TreeNode<Type>*q = NULL;
			for (q = t->firstchild; q != NULL; q = q->nextsibling)
			{
				PostOrder(q);
			}
			cout << t->data << " ";
		}
	}
	
	void LevelOrder(TreeNode<Type>* t)
	{
		if (t != NULL)
		{
			queue<TreeNode<Type>* > Q;
			Q.push(t);
			while (!Q.empty())
			{
				t = Q.front();
				Q.pop();
				cout << t->data << " "; 
				for (t = t->firstchild; t != NULL; t = t->nextsibling)
				{
					Q.push(t);
				}
			}
		}
	}
	
	int TreeNodeNum(TreeNode<Type>* t)const
	{ //先根
		if (t == NULL)
		{
			return 0;
		}
		int count = 1;
		count += TreeNodeNum(t->firstchild);
		count += TreeNodeNum(t->nextsibling);
		return count;
	}
	
	int DeepTree(TreeNode<Type>* t)const
	{ //后根
		if (t == NULL)
		{
			return 0;
		}
		int f_deep = DeepTree(t->firstchild) + 1;
		int n_deep = DeepTree(t->nextsibling);
		return (f_deep > n_deep ? f_deep : n_deep);
	}

private:
	Type				Refvalue;
	TreeNode<Type>	*root;
	
};

void Test()
{//测试
	Tree<char> mytree('#');
	mytree.create(); //创建,先根
	mytree.PreOrder(); //先根遍历
	mytree.InOrder(); //中序遍历
	mytree.PostOrder(); //后根遍历
	mytree.LevelOrder(); //层序遍历
	mytree.TreeNodeNum(); //树的节点数
	mytree.DeepTree(); //树的深度
}

     上面是就是一颗二叉树的建立的代码,我使用模板实现的,只实现了简单的功能,二叉树中最常见的思想就是递归,多写一些二叉树中的代码真的可以提高你对递归算法的熟悉度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值