工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1692|回复: 2

二叉树类的实现

[复制链接]
发表于 2006-4-24 09:56 | 显示全部楼层 |阅读模式
学习数据结构,我的体会到它有三个基础内容:链表,二叉树,排序查找算法
前些天写了一个链表类,开始数据结构学习之路,到现在终于写了二叉树类。个人感觉学习数据结构常常会觉得理解了,却无法用语言来实现,幸好借了本好书,它基本上帮我做了。通过整理,我把它们合成一个类,希望对有些人有帮助。
这是一个精简的二叉树类

  1. //二叉树的实现(精简版)
  2. #include<iostream>
  3. using namespace std;

  4. typedef char ElemType;//为了简单,定义为char
  5. //定义结构体
  6. typedef struct node
  7. {
  8.         ElemType data;
  9.         struct node*lchild;
  10.         struct node*rchild;
  11. }BTNode;
  12. //类定义
  13. class BinaryTree
  14. {
  15. private:
  16.         BTNode*root;                       //根
  17.         void preOrder(BTNode*b);
  18.         void clearTree(BTNode*b);
  19.        
  20. public:
  21.         BinaryTree(char str[]);//输入如"A(B(D(,G)),C(E,F))"构造
  22.         ~BinaryTree();
  23.         void display();
  24. };

  25. BinaryTree::BinaryTree(char* str)
  26. {
  27.         const int MaxSize=100;
  28.         root=NULL;                //初始化为NULL
  29.         BTNode *St[MaxSize],*p=NULL;//St指针数组作栈用
  30.         int top=-1;           //栈顶
  31.         int i=0;          //str的下标
  32.         int j;                 //j=1表示左子树,j=2表示右子树
  33.         char ch=str[i];

  34.         while (ch!='\0')
  35.         {
  36.                 switch (ch)
  37.                 {
  38.                 case '(':top++;St[top]=p;j=1;break;//遇'('入栈
  39.                 case ',':j=2;break;                                  //遇','j=2右子树
  40.                 case ')':top--;break;                     //遇')'出栈
  41.                 default:
  42.                         p=new BTNode;
  43.                         p->data=ch;
  44.                         p->lchild=p->rchild=NULL;

  45.                         if(root==NULL)root=p;//只调用一次,使root指向树根
  46.                         else
  47.                         {
  48.                                 switch(j)
  49.                                 {
  50.                                 case 1:St[top]->lchild=p;break;
  51.                                 case 2:St[top]->rchild=p;break;
  52.                                 }
  53.                         }
  54.                 }
  55.                 i++;
  56.                 ch=str[i];
  57.         }
  58. }

  59. BinaryTree::~BinaryTree()
  60. {
  61.         if(root!=NULL)clearTree(root);
  62. }

  63. //删除树,由析构函数调用
  64. void BinaryTree::clearTree(BTNode*b)
  65. {
  66.         if (b!=NULL)
  67.         {
  68.                 clearTree(b->lchild);
  69.                 clearTree(b->rchild);
  70.                 delete b;
  71.         }                     
  72. }
  73. //先序遍历
  74. void BinaryTree::preOrder(BTNode*b)
  75. {
  76.         if (b!=NULL)
  77.         {
  78.                 cout<<b->data;
  79.                 preOrder(b->lchild);
  80.                 preOrder(b->rchild);     
  81.         }
  82. }
  83. //打印树
  84. void BinaryTree::display()
  85. {
  86.         preOrder(root);
  87. }
  88. //测试一下
  89. int main()
  90. {
  91.         BinaryTree bt("A(B(D(,G)),C(E,F))");
  92.         bt.display();
  93. }
复制代码


这个也很简,只是用到的方法不同。

  1. //二叉树的实现
  2. #include<iostream>
  3. using namespace std;

  4. typedef char ElemType;//为了简单,定义为char
  5. //定义结构体
  6. typedef struct node
  7. {
  8.         ElemType data;
  9.         struct node*lchild;
  10.         struct node*rchild;
  11. }BTNode;
  12. //类定义
  13. class BinaryTree
  14. {
  15. private:
  16.         BTNode*root;                       //根

  17.         void printTree(BTNode*b);          //递归输出
  18.         int treeDepth(BTNode*b);
  19.         BTNode*PreInCreate(char* pre,char*in,int n);//由先序和中序序列构造树的递归
  20.         void clearTree(BTNode*b);

  21. public:
  22.         BinaryTree(char *pre,char*in,int n);//由先序和中序序列构造
  23.         BinaryTree(BTNode*b);
  24.         ~BinaryTree();
  25.         BTNode* getRoot();               //取得根元素
  26.         void display();               //以A(B(D(,G)),C(E,F))格式输出

  27. };

  28. BinaryTree::BinaryTree(BTNode*b)
  29. {
  30.         root=b;
  31. }

  32. //pre为先序字符串,in为中序字符串,n是串长
  33. BinaryTree::BinaryTree(char* pre,char*in,int n)
  34. {
  35.         root=PreInCreate(pre,in,n);
  36. }

  37. BTNode* BinaryTree::PreInCreate(char* pre,char*in,int n)
  38. {
  39.         BTNode*b;
  40.         char*p;
  41.         int k;
  42.         if(n<=0)return NULL;
  43.         b=new BTNode;
  44.         b->data=*pre;
  45.         for(p=in;p<in+n;p++)
  46.                 if(*p==*pre)break;
  47.         k=p-in;
  48.         b->lchild=PreInCreate(pre+1,in,k);
  49.         b->rchild=PreInCreate(pre+k+1,p+1,n-k-1);
  50.         return b;
  51. }
  52. //析构函数
  53. BinaryTree::~BinaryTree()
  54. {
  55.         if(root!=NULL)clearTree(root);
  56. }
  57. //删除树,由析构函数调用
  58. void BinaryTree::clearTree(BTNode*b)
  59. {
  60.         if (b!=NULL)
  61.         {
  62.                 clearTree(b->lchild);
  63.                 clearTree(b->rchild);
  64.                 delete b;
  65.         }                     
  66. }

  67. inline BTNode* BinaryTree::getRoot()
  68. {
  69.         return root;
  70. }
  71. //求树的深度的递归
  72. int BinaryTree::treeDepth(BTNode*b)
  73. {
  74.         int l,r;
  75.         if(b==NULL)return 0;
  76.         else
  77.         {
  78.                 l=treeDepth(b->lchild);
  79.                 r=treeDepth(b->rchild);
  80.                 return (l>r)?(l+1):(r+1);
  81.         }
  82. }

  83. //打印树的递归
  84. void BinaryTree::printTree(BTNode*b)
  85. {
  86.         if (b!=NULL)
  87.         {
  88.                 cout<<b->data;
  89.                 if (b->lchild!=NULL||b->rchild!=NULL)
  90.                 {
  91.                         cout<<"(";
  92.                         printTree(b->lchild);
  93.                         if(b->rchild!=NULL)cout<<",";
  94.                         printTree(b->rchild);
  95.                         cout<<")";
  96.                 }
  97.         }
  98. }
  99. //打印树
  100. void BinaryTree::display()
  101. {
  102.         printTree(root);
  103. }
  104. //测试下
  105. int main()
  106. {
  107.         char a[]="ABDGCEF";
  108.         char b[]="DGBAECF";
  109.         BinaryTree bt(a,b,7);
  110.         bt.display();
  111. }
复制代码


感觉数据结构的学习很多东西是用来理解的,而很难去创新。比如树的构造,书上说到的方法就去看,去理解,很难自己想到新方法来实现。这个帖子就当自己笔记本吧。
你学习数据结构的理解和体会也分享一下,交流交流!
发表于 2006-4-24 11:29 | 显示全部楼层
用栈写的那个不错.
回复

使用道具 举报

发表于 2006-5-8 01:02 | 显示全部楼层
支持一下~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-11 03:45

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表