内容:
(1) 先序创建二叉树;
(2) 实现二叉树的先序递归遍历,按先序遍历的次序显示各结点的值;
(3) 实现二叉树的先序递归遍历,按先序遍历的次序显示各结点的度;
(4) 实现二叉树的中序递归遍历,按中序遍历的次序显示各结点的值;
(5) 实现二叉树的后序递归遍历,按后序遍历的次序显示各结点的值;
(6) 统计二叉树的结点数;
(7) 统计二叉树的叶结点数;
(8) 计算二叉树的深度;
(9) 销毁二叉树。
代码:
#include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; #define OK 1 #define OVERFLOW -2 typedef int status; int sum,du[100]; typedef struct BiTNode { // 结点结构 char data; struct BiTNode *lchild, *rchild; // 左右孩子指针 }BiTNode,*BiTree; status CreateBiTree(BiTree &T) { //以先序方式构造二叉树 char ch; cin>>ch; if (ch=='#') T=NULL; else { T=new(BiTNode); if(!T) exit(OVERFLOW); T->data=ch; T->lchild=T->rchild=NULL; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; }//CreateBiTree void Preorder(BiTree T) { // 先序遍历二叉树 if (T) { cout<<T->data; // 访问根结点 Preorder(T->lchild); //先序遍历左子树 Preorder(T->rchild); //先序遍历右子树 }// if } // Preorder int Nodes(BiTree T) { //先序计算结点个数 if (T==NULL) return 0; else return (1+Nodes(T->lchild)+Nodes(T->rchild)); }// Nodes bool Preorder_du(BiTree T) { // 先序遍历二叉树 if (T) { int s = 0; if(Preorder_du(T->rchild)) s++; //先序遍历右子树 if(Preorder_du(T->lchild)) s++; //先序遍历左子树 //遍历必须反过来才行,因为把结果放入了数组中再倒序输出,所以必须先遍历右子树 du[sum++] = s; return true; }// if return false; } // Preorder bool Midorder(BiTree T) { if(!T) return false; if(T->lchild) Midorder(T->lchild); cout << T->data; if(T->rchild) Midorder(T->rchild); return true; } bool Lastorder(BiTree T) { if(!T) return false; if(T->lchild) Lastorder(T->lchild); if(T->rchild) Lastorder(T->rchild); cout << T->data; return true; } int NodeCount(BiTree T) { if(!T) return 0; else return NodeCount(T->lchild)+NodeCount(T->rchild)+1; } int YeNodeCount(BiTree T) { if(!T) return 0; if(!YeNodeCount(T->lchild)&&!YeNodeCount(T->rchild)) return 1; else return YeNodeCount(T->lchild)+YeNodeCount(T->rchild); } int Depth(BiTree T) { if(!T) return 0; else { int m = Depth(T->lchild); int n = Depth(T->rchild); if(m>n) return m+1; else return n+1; } } void xiaohui(BiTree T) { if (T) { xiaohui(T->lchild); //先序遍历左子树 xiaohui(T->rchild); //先序遍历右子树 free(T); }// if } // Preorder int main() { sum = 0; BiTree T; printf("1、请前序输入二叉树:" ); if(CreateBiTree(T)) printf("创建成功\n"); printf("2、先序遍历二叉树的值:"); Preorder(T); cout << endl; printf("3、先序遍历二叉树的度:"); Preorder_du(T); for(int i = sum-1;i>=0;i--) cout << du[i]; cout <<endl; printf("4、中序遍历二叉树的值:"); Midorder(T); cout << endl; printf("5、后序遍历二叉树的值:"); Lastorder(T); cout << endl; printf("6、计算二叉树的结点数:%d\n",NodeCount(T)); printf("7、计算二叉树的叶结点数:%d\n",YeNodeCount(T)); printf("8、计算二叉树的深度:%d\n",Depth(T)); xiaohui(T); printf("9、销毁成功"); return 0; }
错误反思:实验的时候太心急了(为了限时内完成能加分),没多试几个测试(太自信了)。计算度的时候出现了点bug,顺序出现了错误,我的想法是先保存在数组中,再倒叙输出,可这样的话左右子树就会反过来,所以遍历顺序应该是右-->左-->中而不是左-->右-->中。