二叉树的创建与遍历(链式存储)
这里采用的是链式存储,每个结点包含三个属性(指向左右孩子的指针和本结点的数据),如果想了解顺序存储二叉树,可以参考http://www.cnblogs.com/-beyond/p/6065189.html
采用先序递归创建二叉树,叶子的左右孩子链域为NULL
输入的顺序为:abd--e--c-f-- (-表示空一个空格)
#include<iostream> #include<cstdio> using namespace std; struct BiTNode{ BiTNode *lchild,*rchild; char data; }; typedef BiTNode *BiTree; const char Nil=' ';//默认值 const int maxn=100; //初始化 void InitBiTree(BiTree &T){ T=NULL; } //销毁 void DestoryBiTree(BiTree &T){ if(T){//树不为空 if(T->lchild){//递归方法销毁左子树 DestoryBiTree(T->lchild); } if(T->rchild){//递归方法销毁右子树 DestoryBiTree(T->rchild); } delete(T); T=NULL; } } //此代码段没有调用 void Visit(char value){ cout<<value<<' '; } //先序递归遍历 void PreOrderTraverse(BiTree T){ if(T){ cout<<T->data<<' '; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } //中序递归遍历 void InOrderTraverse(BiTree T){ if(T){ InOrderTraverse(T->lchild); cout<<T->data<<' '; InOrderTraverse(T->rchild); } } //后序递归遍历 void PostOrderTraverse(BiTree T){ if(T){ PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout<<T->data<<' '; } } //先序递归建立二叉树 void CreateBiTree(BiTree &T){ char ch; scanf("%c",&ch); if(ch==Nil){ T=NULL; } else { T=new BiTNode; if(!T){ cout<<"申请内存失败"<<endl; } T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } //判断二叉树是否为空 bool EmptyBiTree(BiTree T){ if(T){ return false; } return true; } //返回二叉树的深度 int BiTreeDepth(BiTree T){ int i,j; if(!T){ return 0; } if(T->lchild){ i=BiTreeDepth(T->lchild); } else i=0; if(T->rchild){ j=BiTreeDepth(T->rchild); } else j=0; return 1+(i>j?i:j); } //返回根 char GetRoot(BiTree T){ if(EmptyBiTree(T)){ return Nil; } return T->data; } //返回结点的值 char GetValue(BiTree p){ return p->data; } //给节点赋值 char Assign(BiTree p,char value){ p->data=value; } int main(){ BiTree T; InitBiTree(T); CreateBiTree(T); cout<<"先序遍历"<<endl; PreOrderTraverse(T); cout<<endl<<"中序遍历"<<endl; InOrderTraverse(T); cout<<endl<<"后序遍历"<<endl; PostOrderTraverse(T); cout<<endl<<"树的根为"<<endl; cout<<GetRoot(T)<<endl; cout<<"深度"<<endl; cout<<BiTreeDepth(T)<<endl; }
测试数据:
abd__e__c_f__
结果:
过程中有点小问题,很容易被忽略的:在创建二叉树的时候,输入单个字符的时候不要用cin,应该用scanf
如需转载,请注明文章出处,谢谢!!!