二叉树的建立基本操作(链表方式)(一)
学习数据结构,一直对二叉树不了解,对指针的调用一知半解。
这二天学二叉树,搞懂了一点点,先写出代码。以后再边学习边来改进。
<pre name="code" class="html"><span style="font-size:18px;">#include <stdlib.h> #include <stdio.h> typedef char DataType; typedef struct node { DataType data; struct node *lchild; struct node *rchild; }BinTNode,*BinTree; void createB(BinTree &T) { DataType ch; scanf("%c",&ch); if(ch=='.') T=NULL; else { T=(BinTNode *)malloc(sizeof(BinTNode)); T->data=ch; createB(T->lchild); createB(T->rchild); } } void Inorder(BinTree &T) { if(T!=NULL) { Inorder(T->lchild); printf("%3c",T->data); Inorder(T->rchild); } } int search(BinTree &T,DataType ch) {/*查找结点CH,找到返回1,否则返回0*/ if(T==NULL) return 0; if(T->data==ch) return 1; return search(T->lchild,ch); return search(T->rchild,ch); } void swapLR(BinTree &T) { /*交换全部结点的左右分支X*/ BinTree t; if(T!=NULL) { swapLR(T->lchild); swapLR(T->rchild); if(T->lchild==NULL&&T->rchild) { T->lchild=T->rchild; T->rchild=NULL; } else if(T->lchild&&T->rchild==NULL) { T->rchild=T->lchild; T->lchild=NULL; } else if(T->lchild&&T->rchild) { t=T->lchild; T->lchild=T->rchild; T->rchild=t; } } } int sortBT(BinTree &T) {/*推断是否为二叉排序树*/ if(T==NULL) return 1; if((T->lchild&&T->lchild->data<T->data)||(T->rchild&&T->rchild->data>T->data)) return 0; return sortBT(T->lchild); return sortBT(T->rchild); } /*二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上全部结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上全部结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;*/ void countdef(BinTree T,int &n) { /*统计叶子结点数*/ if(T!=NULL) { if(T->lchild==NULL&&T->rchild==NULL) n++; countdef(T->lchild,n); countdef(T->rchild,n); } } void depthBT(BinTree T,int d,int *h) { /*求二叉树的深度*/ if(T) { d++; if(d>*h) *h=d; depthBT(T->lchild,d,h); depthBT(T->rchild,d,h); } } void gradeBT(BinTree &T,DataType ch,int d,int *n) {/*求ch结点所在层数*/ if (T) { d++; if(T->data==ch) *n=d; gradeBT(T->lchild,ch,d,n); gradeBT(T->rchild,ch,d,n); } } int main(void) { DataType ch; BinTree root,t; int d=0,h=0,l=1,n=0; root=(BinTNode *)malloc(sizeof(BinTNode)); printf("请依照先序遍历的顺序输入须要中序遍历的字符:\n"); createB(root); Inorder(root); printf("\n"); depthBT(root,d,&h); printf("depth=%d\n",h); gradeBT(root,'c',0,&l); printf("grade=%d\n",l); countdef(root,n); printf("count=%d\n",n); printf("\n"); return 0; } </span>
/*程序执行后的结果是:
请依照先序遍历的顺序输入须要中序遍历的字符:
abc..de.g..f...
c b e g d f a
depth=5
grade=3
count=3
Press any key to continue
*/