数据结构----二叉树

在计算机科学与技术当中,二叉树是一种有双分支的树,分为左子树和右子树,在计算机领域有很大的作用。

二叉树的实现:

我们利用一道题来讲解一下二叉树如何构成:

!!!注意,这里我们利用的是前序遍历的方式构成子树,当输入#时表示其节点为空,所以不必向前进行

要求:

1.采用二叉链表的方式进行存储

2.构造一个二叉树类

实现以下算法:

1.创建二叉树

2.对二叉树进行前序、中序、后序遍历

#include<bits/stdc++.h>
using namespace std;
template <class T>
struct Node
{
	T  data;
	Node<T> *lchild, *rchild;
};
template <class T>
class Tree
{
public:
	Tree();
	void POrder() { POrder(root); }
	void IOrder() { IOrder(root); }
	void PoOrder() { PoOrder(root) ;}
private:
	Node<T> *root;
	void Creat(Node<T> *& root);
	void POrder(Node<T> *root);
	void IOrder(Node<T> *root);
	void PoOrder(Node<T> *root);
};
template<class T>
 Tree<T>::Tree()
{
	Creat(root);
}

template<class T>
void Tree<T>::Creat(Node<T>*&root)    //这就是构造二叉树的核心,我们在这里输入数,如果不输入,那么我们创造一个新的节点,将                   
                                         //数据存储下来,然后构造左子树,再构造右子树
{

	T ch;
	cin>>ch;
	if (ch=='#') root=NULL;
	else {
		root=new Node<T>;
		root->data=ch;
		Creat(root->lchild);      //构造左子树
		Creat(root->rchild);      //构造右子树
//若采用其他遍历的方式,则构造上就找一下先构造哪个子树
	}

}

template<class T>
void Tree<T>::POrder(Node<T> *root)
{
	if (root==NULL) return;
	else
	{                                     //前序遍历,中序后序遍历区别就在于输出数值的位置,放于顶端是前序,放在中间
		                                //是中序,放在后面是后序,思考一下看对不对
                  cout<<root->data;
		POrder(root->lchild);
		POrder(root->rchild);
	}
}

template<class T>
void Tree<T>::IOrder(Node<T> *root)
{
     if (root==NULL) return;
     else
     {
        IOrder(root->lchild);
        cout<<root->data;
        IOrder(root->rchild);
     }
}

template<class T>
void Tree<T>::PoOrder(Node<T> *root)
{
     if (root==NULL) return;
     else
     {
         PoOrder(root->lchild);
         PoOrder(root->rchild);
         cout<<root->data ;
     }
}

int main()
{
	char s;
	while (1)
	{
		Tree<char> a;
		cin>>s;
		a.POrder();
		cout<<endl;
        a.IOrder();
		cout<<endl;
		a.PoOrder();
		cout<<endl;
		if (s=='N') break;
	}
	return 0;
}

这是链表的方式构造二叉树,下面再贴一道题,用顺序存储的方式构造二叉树:

描述

写出顺序存储的二叉树的前序遍历、中序遍历、后续遍历算法

输入

第一行:二叉树中的结点个数n
之后的n行中,每一行包含两个数据 :
number: 代表结点在完全二叉树中的层序编号(根节点编号是1)
value: char 型的数据,代表结点的值

#include<bits/stdc++.h>
using namespace std;
class Tree
{
    public:
    Tree(int n)
    {
        Creat(n);
    }
    void Creat(int n);
    void PreOrder(int i,int n);
    void InOrder(int i,int n);
    void PostOrder(int i,int n);
    char ch[100];
};
    void Tree::Creat(int n)           //构造二叉树
    {
        char t;
        t=(char)n;
        ch[0]=t;
        for(int i=1;i<=n;i++)
        {
            cin>>i;
            cin>>ch[i];
        }
    }
    void Tree::PreOrder(int i,int n)
    {
        if(ch[i]!='#')
          cout<<ch[i];
          else return;
        if (2*i<=n)
          PreOrder(2*i,n);       //因为是字符数组存储,所以唯一不同就是这儿了,2*i是左子树,2*i+1是右子树,找个图看是不是
        if (2*i+1<=n)
          PreOrder(2*i+1,n);
    }
    void Tree::InOrder(int i,int n)
    {

        if (2*i<=n)
          PreOrder(2*i,n);
        if (ch[i]!= '#')
          cout<<ch[i];
          else return;
        if (2*i+1<=n)
          PreOrder(2*i+1,n);
    }
    void Tree::PostOrder(int i,int n)
    {

        if(2*i<=n)
          PreOrder(2*i,n);
        if(2*i+1<=n)
          PreOrder(2*i+1,n);
        if(ch[i]!='#')
          cout<<ch[i];
          else return;
    }
int main()
{
    int n;
    cin>>n;
    Tree T(n);
    T.PreOrder(1,n);
    cout<<endl;
    T.InOrder(1,n);
    cout<<endl;
    T.PostOrder(1,n);
    cout<<endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值