树 前序,中序,后序,层次遍历,获取树的高度

本程序建树方法采用“先序遍历+空树用0表示”

结点和树的构建

class Node
{
public:
	char data;
	Node *left,*right; 
	Node()
	{
		left=right=NULL;
		}	
};
class Tree
{
private:
	Node *Root;
public:	
	Tree(){Root=Create();}
	Node* Create();//树的创建(前序遍历方法
	void visit(Node *p)
	{	//访问P结点的数据
        cout<<p->data;
	}
	void PreOrder(Node *node);//前序遍历输出
	void InOrder(Node *node);//中序遍历输出
	void PostOrder(Node *node);//后序遍历输出
	void LevelOrder(Node* node);//层次遍历输出
	int GetHeight(Node*node);//获得树的高度 
	Node* GetRoot()
	{
		return Root;
	}
	~Tree(){
	}	
};

创建树(前序遍历方法)

Node *Create()
    {
        Node *p;
        char ch;
        ch=x[now++];
        if(ch=='0')
            p=NULL;
        else
        {
            p=new Node();
            p->data=ch;
            p->left=Create();//先前序遍历左子树
            p->right=Create();//前序遍历右子树
        }
        return p;
    }

 前序遍历:

void PreOrder(Node *node)
    {
        if(node!=NULL)
        {
        	visit(node);//输出结点的信息
        	PreOrder(node->left);
        	PreOrder(node->right);
		}
    }

中序遍历:

void InOrder(Node *node)
    {
        if(node!=NULL)
        {
        	InOrder(node->left); //中序遍历左子树
			visit(node);
        	InOrder(node->right);//中序遍历右子树
		}
    }

后序遍历:

void PostOrder(Node *node)
    {
        if(node!=NULL)
        {
        	PostOrder(node->left); //后序遍历左子树
        	PostOrder(node->right); //后序遍历右子树  
			visit(node);
		}
    }

层次遍历

void LevelOrder(Node *node)
	{
		queue<Node *> Queue;//用队列输出
		Node *p;
		if(node!=NULL)
			Queue.push(node);
		while(!Queue.empty())
		{
			p=Queue.front();
			visit(p);
			Queue.pop();
			if(p->left!=NULL)//把p的左孩子放进队列
				Queue.push(p->left);
			if(p->right!=NULL)//把p的右孩子放进队列
				Queue.push(p->right);
			
		}
	}

获得树的高度:

int Tree::GetHeight(Node* node)
{
	if(node==NULL)
		return 0;
	int size1=GetHeight(node->left);
	int size2=GetHeight(node->right);
	if(size1>size2)
		return (++size1);
	else
		return (++size2);
}

总代码:

#include<bits/stdc++.h>
using namespace std;
string x;  //
int now=0;   //
class Node
{
public:
	char data;
	Node *left,*right; 
	Node()
	{
		left=right=NULL;
		}	
};
class Tree
{
private:
	Node *Root;
public:	
	Tree(){Root=Create();}
	Node* Create();//树的创建(前序遍历方法
	void visit(Node *p)
	{	//访问P结点的数据
        cout<<p->data;
	}
	void PreOrder(Node *node);//前序遍历输出
	void InOrder(Node *node);//中序遍历输出
	void PostOrder(Node *node);//后序遍历输出
	void LevelOrder(Node* node);//层次遍历输出
	Node* GetRoot()
	{
		return Root;
	}
	int GetHeight(Node*node);//获得树的高度 
	~Tree(){
	}	
};
Node* Tree::Create()
    {
        Node *p;
        char ch;
        ch=x[now++];
        if(ch=='0')
            p=NULL;
        else
        {
            p=new Node();
            p->data=ch;
            p->left=Create();//先前序遍历左子树
            p->right=Create();//前序遍历右子树
        }
        return p;
    }
void Tree::PreOrder(Node *node)
    {
        if(node!=NULL)
        {
        	visit(node);//输出结点的信息
        	PreOrder(node->left);
        	PreOrder(node->right);
		}
    }
void Tree::InOrder(Node *node)
    {
        if(node!=NULL)
        {
        	InOrder(node->left); //中序遍历左子树
			visit(node);
        	InOrder(node->right);//中序遍历右子树
		}
    }
void Tree::PostOrder(Node *node)
    {
        if(node!=NULL)
        {
        	PostOrder(node->left); //后序遍历左子树
        	PostOrder(node->right); //后序遍历右子树  
			visit(node);
		}
    }
void Tree::LevelOrder(Node *node)
	{
		queue<Node *> Queue;//用队列输出
		Node *p;
		if(node!=NULL)
			Queue.push(node);
		while(!Queue.empty())
		{
			p=Queue.front();
			visit(p);
			Queue.pop();
			if(p->left!=NULL)//把p的左孩子放进队列
				Queue.push(p->left);
			if(p->right!=NULL)//把p的右孩子放进队列
				Queue.push(p->right);
			
		}
	}
int Tree::GetHeight(Node* node)
{
	if(node==NULL)
		return 0;
	int size1=GetHeight(node->left);
	int size2=GetHeight(node->right);
	if(size1>size2)
		return (++size1);
	else
		return (++size2);
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		cin>>x;
		now=0;
		Tree tree;
		cout<<"Pre--"<<endl;
		tree.PreOrder(tree.GetRoot());
		cout<<endl;
		cout<<"In--"<<endl;
		tree.InOrder(tree.GetRoot());
		cout<<endl;
		cout<<"Post--"<<endl;
		tree.PostOrder(tree.GetRoot());
		cout<<endl;
		cout<<"Level--"<<endl;
		tree.LevelOrder(tree.GetRoot());
		cout<<endl;
		cout<<"height--" <<endl;
		cout<<tree.GetHeight(tree.GetRoot())<<endl;
		cout<<endl;
		
	}
}

数据输入:

扫描二维码关注公众号,回复: 3659216 查看本文章

2

AB0C00D00

ABCD00E000FG00H0I00

这两棵树的图像:

输出:

猜你喜欢

转载自blog.csdn.net/forTiffanyY/article/details/83047237
今日推荐