一般书上都有。作为非主流IT人儿,认认真真编一次才是王道。 这个是链表存储的二叉树: #ifndef _H_LINKTREE #define _H_LINKTREE #include <iostream> #include <stdlib.h> #include <stack> #include <vector> #include <queue> using namespace std; struct BinTreeNode; typedef struct BinTreeNode *pBinTreeNode; struct BinTreeNode { int data; pBinTreeNode left; pBinTreeNode right; }; pBinTreeNode leftChild_link(pBinTreeNode p) { if(p==NULL)return NULL; return p->left; }; pBinTreeNode rightChild_link(pBinTreeNode p) { if(p==NULL)return NULL; return p->right; }; pBinTreeNode createBT() { int ele; cin>>ele; pBinTreeNode root; if(ele==-1) { root=NULL; } else { root=(pBinTreeNode)malloc(sizeof(BinTreeNode)); root->data=ele; root->left=createBT(); root->right=createBT(); } return root; } pBinTreeNode createBTFromArray(int *array, int i, int n) { if(i>=n) { return NULL; } pBinTreeNode p; p=(pBinTreeNode)malloc(sizeof(BinTreeNode)); p->data=array[i]; p->left=createBTFromArray(array,2*i+1,n); p->right=createBTFromArray(array,2*i+2,n); return p; } void preOrder(pBinTreeNode p) { if(p==NULL) { return ; } cout<<p->data; preOrder(p->left); preOrder(p->right); } void InOrder(pBinTreeNode p) { if(p==NULL) { return; } InOrder(p->left); cout<<p->data; InOrder(p->right); } void PostOrder(pBinTreeNode p) { if(p==NULL) { return; } PostOrder(p->left); PostOrder(p->right); cout<<p->data; } void preOrder_Stack(pBinTreeNode p) { stack<pBinTreeNode> Stack; Stack.push(p); pBinTreeNode tmp; while(!Stack.empty()) { tmp=Stack.top(); Stack.pop(); if(tmp!=NULL) { cout<<tmp->data; Stack.push(tmp->right); Stack.push(tmp->left); } } } void InOrder_Stack(pBinTreeNode p) { stack<pBinTreeNode> Stack; pBinTreeNode tmp=p; int maxdeep=0; int deep=0; do { while(tmp!=NULL) { Stack.push(tmp); tmp=tmp->left; } tmp=Stack.top(); Stack.pop(); cout<<tmp->data; tmp=tmp->right; }while(tmp!=NULL || !Stack.empty()); cout<<"The deepth of this tree is : "<<deep<<endl; }; void PostOrder_Stack(pBinTreeNode p) { stack<pBinTreeNode> Stack; pBinTreeNode cur=p; pBinTreeNode pre; int maxDep=0; while(cur!=NULL || !Stack.empty()) { while(cur!=NULL) { Stack.push(cur); pre=cur->right; cur=cur->left; if(cur==NULL) cur=pre; } cur=Stack.top(); Stack.pop(); cout<<cur->data<<" "; if(!Stack.empty()&&Stack.top()->left==cur) { cur=Stack.top()->right; } else { cur=NULL; } } } void BFS(pBinTreeNode p) { queue<pBinTreeNode> Queue; pBinTreeNode tmp=p; Queue.push(tmp); int countDeep=0; while(!Queue.empty()) { tmp=Queue.front(); Queue.pop(); cout<<tmp->data<<endl; if(tmp->left!=NULL) { Queue.push(tmp->left); } if(tmp->right!=NULL) { Queue.push(tmp->right); } } } #endif 这个是数组存储的二叉树: #ifndef _H_BT_SEQ #define _H_BT_SEQ #include <iostream> #include <stack> #define MAXNUM 100 using namespace std; struct SeqBinTree { int max; int n; int *nodelist; }; typedef SeqBinTree *pSeqBinTree; int parent_seq(pSeqBinTree t, int p) { if(p>=t->n || p<0 ) { cout<<"illigel param!"<<endl; return -1; } else { return (p-1)/2; } } int leftChild_seq(pSeqBinTree t, int p) { if(p>=t->n || p<0) { cout<<"illigel param!"<<endl; return -1; } else { return 2*p+1; } } int rightChild_seq(pSeqBinTree t, int p) { if(p>=t->n || p<0) { cout<<"illigel param!"<<endl; return -1; } else { return 2*p+2; } } void printBT_BFS(pSeqBinTree t) { for(int i=0;i<t->n;++i) { cout<<t->nodelist[i]<<endl; } } void CreateBT(pSeqBinTree pSbt) { int el=0; cin>>el; int i=0; for(int k=0;k<pSbt->max;k++) { pSbt->nodelist[k]=0; } while(el!=-1) { pSbt->nodelist[i++]=el; ++pSbt->n; cin>>el; } }