【数据结构】3-1 二叉树的先序创建及遍历操作
二叉树真的令人头大
#include<iostream> using namespace std; template <class T> struct BTNode//二叉链表结点结构 { T data; //二叉树中的元素 BTNode<T> *lchild, *rchild; }; template <class T> class BTree //二叉树的二叉链表类 { private: BTNode<T> *root; //二叉树的根指针 BTNode<T>* pre_create();// 先序创建二叉链表结构二叉树r void preOrder(BTNode<T>*r);//先序遍历二叉树r void inOrder(BTNode<T>*r);//中序遍历二叉树r void postOrder(BTNode<T>*r);//后序遍历二叉树r void numOfNode(BTNode<T>*r, int &cont);//统计二叉树r中的结点个数 public: BTree() { root = NULL; } void preCreat(); void preOrder() { cout << "先序遍历:"; preOrder(root); cout << endl; }//先序遍历二叉树 void inOrder() { cout << "中序遍历:"; inOrder(root); cout << endl;}//中序遍历二叉树 void postOrder() { cout << "后序遍历:"; postOrder(root); cout << endl;}//后序遍历二叉树 int numOfNode();//统计二叉树中的结点个数 }; template<class T> BTNode<T>* BTree<T>::pre_create() { char ch; cin >> ch; BTNode<T> *p; if (ch =='#') { p = NULL; } else { p = new BTNode<T>(); p->data = ch; p->lchild = pre_create(); p->rchild = pre_create(); } return p; } template<class T> void BTree<T>::inOrder(BTNode<T>*r) { if (r!=NULL) { inOrder(r->lchild); cout << r->data << " "; inOrder(r->rchild); } } template<class T> void BTree<T>::postOrder(BTNode<T>*r) { if (r!=NULL) { postOrder(r->lchild); postOrder(r->rchild); cout << r->data << " "; } } template<class T> void BTree<T>::preOrder(BTNode<T>*r) { if (r!=NULL) { cout << r->data << " "; preOrder(r->lchild); preOrder(r->rchild); } } template<class T> void BTree<T>::numOfNode(BTNode<T>*r,int &cont) { if (r) { cont++; numOfNode(r->lchild,cont); numOfNode(r->rchild,cont); } } template<class T> void BTree<T>::preCreat() { cout << "请按照先序的方式输入要创建的二叉树,空用#表示" << endl; root = pre_create(); cout << "二叉树创建成功!" << endl; } template<class T> int BTree<T>::numOfNode() { int cont = 0; numOfNode(root, cont); return cont; } int main() { BTree<char> test; test.preCreat(); test.preOrder(); test.inOrder(); test.postOrder(); cout << "二叉树中的节点个数为:" << test.numOfNode() << endl; system("pause"); return 0; }
输入格式为先序遍历的结果,空用#表示
会自动输出创建好的二叉树的先序,中序,后序遍历的结果