二叉树的创建和遍历(这个内容说二叉树的创立比较形象,特别是怎么输入数据创立二叉树)

自己写了个二叉树的操作,参考了一下别人的写法,发现应该好好学习一下别人的写法 

源文地址:

http://hi.baidu.com/klcstudy/blog/item/5fdf49b5b57d62ce37d3ca18.html/cmtid/203d9f10fe11210c203f2e8e

 

 

贴上参考来的代码:

 

[cpp]  view plain copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. //*************************************************************************************  
  6. //二叉树结点类的定义  
  7. template<class T>  
  8. struct BTNode  
  9. {  
  10.     T data;  
  11.     BTNode <T> * Lchild,*Rchild;  
  12.     BTNode(T nodeValue = T(),BTNode<T>* leftNode = NULL,BTNode<T>* rightNode = NULL )  
  13.         :data(nodeValue),Lchild(leftNode),Rchild(rightNode){}       //可选择参数的默认构造函数  
  14. };  
  15. //**************************************************************************************  
  16. //二叉树的建立  
  17. template <class T>  
  18. void createBinTree(BTNode<T> * &root )  
  19. {  
  20.     BTNode<T>* p = root;  
  21.     BTNode<T>* k;  
  22.     T nodeValue ;  
  23.     cin>>nodeValue;  
  24.     if(nodeValue==-1)  
  25.     {  
  26.         root=NULL;  
  27.     }  
  28.     else  
  29.     {  
  30.         root=new BTNode<T>();  
  31.         root->data = nodeValue;  
  32.         createBinTree(root->Lchild);  
  33.         createBinTree(root->Rchild);  
  34.     }  
  35. }  
  36. //************************************************************************************  
  37. //二叉树的先序遍历  
  38. template <class T>  
  39. void preOrder( BTNode<T> * & p)  
  40. {  
  41.     if(p)  
  42.     {  
  43.         cout<<p->data<<" ";  
  44.         preOrder(p->Lchild);  
  45.         preOrder(p->Rchild);  
  46.     }  
  47. }  
  48. //**************************************************************************************  
  49. //二叉树的中序遍历  
  50. template <class T>  
  51. void inOrder(BTNode<T> * & p)  
  52. {  
  53.       
  54.     if(p)  
  55.     {  
  56.         inOrder(p->Lchild);  
  57.         cout<<p->data<<" ";  
  58.         inOrder(p->Rchild);  
  59.     }  
  60. }  
  61. //**************************************************************************************  
  62. //二叉树的后序遍历  
  63. template <class T>  
  64. void levelOrder(BTNode<T> *& p)  
  65. {  
  66.     if(p)  
  67.     {  
  68.         levelOrder(p->Lchild);  
  69.         levelOrder(p->Rchild);  
  70.         cout<<p->data<<" ";  
  71.     }  
  72. }  
  73. //*************************************************************************************  
  74. //统计二叉树中结点的个数  
  75. template<class T>  
  76. int countNode(BTNode<T> * & p)  
  77. {  
  78.     if(p == NULL) return 0;  
  79.     return 1+countNode(p->Lchild)+countNode(p->Rchild);  
  80. }  
  81. //***********************************************************************************  
  82. //求二叉树的深度  
  83. template<class T>  
  84. int depth(BTNode<T> *& p)  
  85. {  
  86.     if(p == NULL)  
  87.         return -1;  
  88.     int h1 = depth(p->Lchild);  
  89.     int h2 = depth(p->Rchild);  
  90.     if(h1>h2)return (h1+1);  
  91.     return h2+1;  
  92. }  
  93. //***********************************************************************************  
  94. //二叉树的消毁操作  
  95. template<class T>  
  96. BTNode<T>* destroy(BTNode<T>* p)                         //消毁函数,用来消毁二叉树中的各个结点  
  97.     {  
  98.         if(p)  
  99.         {  
  100.             return destroy(p->Lchild);  
  101.             return destroy(p->Rchild);  
  102.             delete p;  
  103.         }  
  104.     }  
  105. //********************************************************************************  
  106. //主函数的设计   
  107. int main ()  
  108. {  
  109.     BTNode<int> * rootNode = NULL;  
  110.     int choiced = 0;  
  111.     while(true)  
  112.     {  
  113.         system("cls");  
  114.         cout<<"/n/n/n                              ---主界面---/n/n/n";  
  115.         cout<<"                     1、创建二叉树                2、先序遍历二叉树/n";  
  116.         cout<<"                     3、中序遍历二叉树            4、后序遍历二叉树/n";  
  117.         cout<<"                     5、统计结点总数              6、查看树深度    /n";  
  118.         cout<<"                     7、消毁二叉树                0、退出/n/n";  
  119.         cout<<"             请选择操作:";  
  120.         cin>>choiced;  
  121.         if(choiced == 0)  
  122.             return 0;  
  123.         else if(choiced == 1)  
  124.         {  
  125.             system("cls");  
  126.             cout<<"请输入每个结点,回车确认,并以-1结束:/n";  
  127.             createBinTree(rootNode );  
  128.         }  
  129.         else if(choiced == 2)  
  130.         {  
  131.             system("cls");  
  132.             cout<<"先序遍历二叉树结果:/n";  
  133.             preOrder(rootNode);  
  134.             cout<<endl;  
  135.             system("pause");  
  136.         }  
  137.         else if(choiced == 3)  
  138.         {  
  139.             system("cls");  
  140.             cout<<"中序遍历二叉树结果:/n";  
  141.             inOrder(rootNode);  
  142.             cout<<endl;  
  143.             system("pause");  
  144.         }  
  145.         else if(choiced == 4)  
  146.         {  
  147.             system("cls");  
  148.             cout<<"后序遍历二叉树结果:/n";  
  149.             levelOrder(rootNode);  
  150.             cout<<endl;  
  151.             system("pause");  
  152.         }  
  153.         else if(choiced == 5)  
  154.         {  
  155.             system("cls");  
  156.             int count = countNode(rootNode);  
  157.             cout<<"二叉树中结点总数为"<<count<<endl;  
  158.             system("pause");  
  159.         }  
  160.         else if(choiced == 6)  
  161.         {  
  162.             system("cls");  
  163.             int dep = depth(rootNode);  
  164.             cout<<"此二叉树的深度为"<<dep<<endl;  
  165.             system("pause");  
  166.         }  
  167.         else if(choiced == 7)  
  168.         {  
  169.             system("cls");  
  170.             cout<<"二叉树已被消毁!/n";  
  171.             destroy(rootNode);  
  172.             cout<<endl;  
  173.             system("pause");  
  174.         }  
  175.         else   
  176.         {  
  177.             system("cls");  
  178.             cout<<"/n/n/n/n/n/t错误选择!/n";  
  179.         }  
  180.           
  181.     }  
  182. }  

 

 

 

如                           5
                            /     /
                          3       8
                         / /     / /
                        2   4   6    9
                       / /   / / / /    / /
                     1 -1-1-1-17 -1 -1
                    / /              / /
                 -1 -1          -1 -1

那么输入时的序列为:5321-1-1-14-1-186-17-1-19-1-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值