在计算机科学与技术当中,二叉树是一种有双分支的树,分为左子树和右子树,在计算机领域有很大的作用。
二叉树的实现:
我们利用一道题来讲解一下二叉树如何构成:
!!!注意,这里我们利用的是前序遍历的方式构成子树,当输入#时表示其节点为空,所以不必向前进行
要求:
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; }