找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3121|回复: 0

【算法】二叉树的层次遍历

[复制链接]
发表于 2014-12-30 16:13:15 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
问题:
如何实现二叉树的层次遍历?
解析:
我们可以使用队列来解决这个问题
<1>将根节点压入队列
<2>判断队列是否为空
<3>不为空则获取队列最前端的元素,打印出该元素
<4>将该元素移除队列
<5>如果该元素有左孩子,则将其左孩子进入队列
<6>如果该元素有右孩子,则将其右孩子进入队列
主要函数如下所示:
  1. template<typename Type> void BSTrees<Type>::traverseLevel(Node* root)
  2. {
  3.         if( root == NULL)
  4.         {
  5.                 cout<<"This is a empty tree"<<endl;
  6.                 return;
  7.         }
  8.         queue<Node*> que;
  9.         que.push(root);
  10.         while( !que.empty() )
  11.         {
  12.                 Node* ptr = que.front();
  13.                 que.pop();
  14.                 cout<<ptr->e<<endl;
  15.                 if(ptr->leftChild != NULL)
  16.                         que.push(ptr->leftChild);
  17.                 if(ptr->rightChild != NULL)
  18.                         que.push(ptr->rightChild);
  19.         }
  20. }
复制代码
整个程序如下所示:
BSTrees.h
  1. //BSTrees.h
  2. #ifndef DDXX_BSTREES_H
  3. #define DDXX_BSTREES_H
  4. #include <iostream>
  5. #include <queue>
  6. using namespace std;
  7. template<typename Type>
  8. class BSTrees
  9. {
  10. public:
  11.         BSTrees();
  12.         ~BSTrees();
  13. public:
  14.         struct Node
  15.         {
  16.                 Type    e;
  17.                 Node*   leftChild;
  18.                 Node*   rightChild;
  19.                 Node()
  20.                 {
  21.                 }
  22.                 Node(Type _e)
  23.                 {
  24.                         e           = _e;
  25.                         leftChild   = NULL;
  26.                         rightChild  = NULL;
  27.                 }
  28.         };
  29. public:
  30.         bool    insert(Type e);
  31.         bool    erase1(Type e);
  32.         bool    erase2(Type e);
  33.         void    clear();
  34.         bool    isEmpty();
  35.         int     getLength();
  36.         Node*   find(Type e);
  37.         Node*   getRoot();
  38.         Node*   getParent(Node* p);
  39.         void    traverse(Node* ptr);
  40.         void    traverseLevel(Node* ptr);
  41. private:
  42.         void    clears(Node* &p);
  43. private:
  44.         Node*   m_root;
  45.         int     m_Length;
  46. };

  47. template<typename Type> BSTrees<Type>::BSTrees()
  48. {
  49.         m_root = NULL;
  50.         m_Length = 0;
  51. }

  52. template<typename Type> bool BSTrees<Type>::insert(Type e)
  53. {
  54.         Node* ptr = new Node(e);
  55.         if ( ptr == NULL )
  56.         {
  57.                 cout<<"Allocate memory for the element failed"<<endl;
  58.                 return false;
  59.         }

  60.         if( m_root == NULL)
  61.         {
  62.                 m_root = ptr;
  63.                 m_Length++;
  64.                 return true;
  65.         }

  66.         Node* p         = m_root;
  67.         Node* pParent   = m_root;
  68.         while( p != NULL)
  69.         {
  70.                 if( e == p->e)
  71.                 {
  72.                         cout<<"the element is already exist"<<endl;
  73.                         delete ptr;
  74.                         ptr = NULL;
  75.                         return false;
  76.                 }

  77.                 pParent = p;
  78.                 if( e > p->e)
  79.                 {
  80.                         p = p->rightChild;
  81.                 }
  82.                 else
  83.                 {
  84.                         p = p->leftChild;
  85.                 }
  86.         }

  87.         if( e < pParent->e )
  88.         {
  89.                 pParent->leftChild = ptr;
  90.         }
  91.         if( e > pParent->e)
  92.         {
  93.                 pParent->rightChild = ptr;
  94.         }

  95.         m_Length++;
  96.         return true;
  97. }

  98. template<typename Type> bool BSTrees<Type>::erase1(Type e)
  99. {
  100.         Node *p = find(e);
  101.         if ( p == NULL )
  102.         {
  103.                 cout<<"There's no this element to delete"<<endl;
  104.                 return false;
  105.         }

  106.         if ( p->leftChild == NULL)
  107.         {
  108.                 Node* pParent = getParent(p);
  109.                 if( pParent->leftChild == p )
  110.                         pParent->leftChild = p->rightChild;
  111.                 else
  112.                         pParent->rightChild = p->rightChild;
  113.                 delete p;
  114.                 p = NULL;

  115.                 m_Length--;
  116.                 return true;
  117.         }

  118.         if ( p->rightChild == NULL)
  119.         {
  120.                 Node* pParent = getParent(p);
  121.                 if( pParent->leftChild == p)
  122.                         pParent->leftChild = p->leftChild;
  123.                 else
  124.                         pParent->rightChild = p->leftChild;
  125.                 delete p;
  126.                 p = NULL;

  127.                 m_Length--;
  128.                 return true;
  129.         }

  130.         if ( p->leftChild != NULL && p->rightChild != NULL)
  131.         {
  132.                 Node* pParent = getParent(p);
  133.                 Node* pPre = p->leftChild;
  134.                 Node* ptmp = pPre;
  135.                 while( pPre->rightChild != NULL )
  136.                 {
  137.                         ptmp = pPre;
  138.                         pPre = pPre->rightChild;
  139.                 }
  140.                 if( ptmp != pPre)
  141.                 {   ptmp->rightChild = pPre->leftChild;
  142.                         pPre->leftChild = p->leftChild;
  143.                         pPre->rightChild = p->rightChild;
  144.                 }
  145.                 else
  146.                         pPre->rightChild = p->rightChild;

  147.                 if( pParent == NULL )
  148.                         m_root = pPre;
  149.                 else
  150.                         if( pParent->leftChild == p)
  151.                                 pParent->leftChild = pPre;
  152.                         else
  153.                                 pParent->rightChild = pPre;

  154.                 delete p;
  155.                 p = NULL;

  156.                 m_Length--;
  157.                 return true;
  158.         }

  159. }

  160. template<typename Type> bool  BSTrees<Type>::erase2(Type e)
  161. {
  162.         Node *p = find(e);
  163.         if ( p == NULL )
  164.         {
  165.                 cout<<"There's no this element to delete"<<endl;
  166.                 return false;
  167.         }

  168.         if ( p->leftChild == NULL)
  169.         {
  170.                 Node* pParent = getParent(p);
  171.                 if( pParent->leftChild == p )
  172.                         pParent->leftChild = p->rightChild;
  173.                 else
  174.                         pParent->rightChild = p->rightChild;
  175.                 delete p;
  176.                 p = NULL;

  177.                 m_Length--;
  178.                 return true;
  179.         }

  180.         if ( p->rightChild == NULL)
  181.         {
  182.                 Node* pParent = getParent(p);
  183.                 if( pParent->leftChild == p)
  184.                         pParent->leftChild = p->leftChild;
  185.                 else
  186.                         pParent->rightChild = p->leftChild;
  187.                 delete p;
  188.                 p = NULL;

  189.                 m_Length--;
  190.                 return true;
  191.         }
  192.         if( p->leftChild != NULL && p->rightChild != NULL)
  193.         {
  194.                 Node* pParent = getParent(p);
  195.                 Node* ptr = p->leftChild;
  196.                 while( ptr->rightChild != NULL )
  197.                         ptr = ptr->rightChild;
  198.                 ptr->rightChild = p->rightChild;

  199.                 if( pParent == NULL )
  200.                         m_root = p->leftChild;
  201.                 else
  202.                         if(pParent->leftChild == p)
  203.                                 pParent->leftChild = p->leftChild;
  204.                         else
  205.                                 pParent->rightChild = p->leftChild;
  206.                 delete p;
  207.                 p = NULL;
  208.                 m_Length--;
  209.                 return true;
  210.         }
  211. }

  212. template<typename Type> void  BSTrees<Type>::clear()
  213. {
  214.         if( m_root == NULL )
  215.                 return;
  216.         clears(m_root);
  217.         m_root = NULL;
  218. }

  219. template<typename Type> void   BSTrees<Type>::clears(Node* &p)
  220. {
  221.         if(p->leftChild != NULL)
  222.         {
  223.                 clears(p->leftChild);
  224.                 p->leftChild = NULL;
  225.         }
  226.         if(p->rightChild != NULL)
  227.         {
  228.                 clears(p->rightChild);
  229.                 p->rightChild = NULL;
  230.         }
  231.         delete p;
  232.         p = NULL;
  233.         m_Length--;

  234. }
  235. template<typename Type> typename BSTrees<Type>::Node* BSTrees<Type>::getRoot()
  236. {
  237.         return m_root;
  238. }
  239. template<typename Type> int       BSTrees<Type>::getLength()
  240. {
  241.         return m_Length;
  242. }
  243. template<typename Type> typename BSTrees<Type>::Node* BSTrees<Type>::getParent(Node* p)
  244. {
  245.         if( p == m_root)
  246.                 return NULL;
  247.         Node* ptr = m_root;
  248.         Node* ptf = ptr;
  249.         while( ptr != NULL )
  250.         {
  251.                 if ( ptr->e == p->e )
  252.                         return ptf;
  253.                 if ( ptr->e > p->e )
  254.                 {
  255.                         ptf = ptr;
  256.                         ptr = ptr->leftChild;
  257.                 }
  258.                 else
  259.                 {
  260.                         ptf = ptr;
  261.                         ptr = ptr->rightChild;
  262.                 }
  263.         }

  264. }

  265. template<typename Type> typename BSTrees<Type>::Node* BSTrees<Type>::find(Type e)
  266. {
  267.         Node* ptr = m_root;

  268.         while(ptr != NULL)
  269.         {
  270.                 if ( ptr->e == e )
  271.                         return ptr;
  272.                 if ( ptr->e > e )
  273.                         ptr = ptr->leftChild;
  274.                 else
  275.                         ptr = ptr->rightChild;
  276.         }
  277.         //if ( ptr == NULL )
  278.         return NULL;
  279. }

  280. template<typename Type> void BSTrees<Type>::traverse(Node* ptr)
  281. {
  282.         if( ptr == NULL )
  283.                 return;
  284.         if( ptr->leftChild != NULL )
  285.                 traverse(ptr->leftChild);
  286.         cout<<"Element value:"<<ptr->e<<endl;
  287.         if( ptr->rightChild != NULL )
  288.                 traverse(ptr->rightChild);
  289. }

  290. template<typename Type> void BSTrees<Type>::traverseLevel(Node* root)
  291. {
  292.         if( root == NULL)
  293.         {
  294.                 cout<<"This is a empty tree"<<endl;
  295.                 return;
  296.         }
  297.         queue<Node*> que;
  298.         que.push(root);
  299.         while( !que.empty() )
  300.         {
  301.                 Node* ptr = que.front();
  302.                 que.pop();
  303.                 cout<<ptr->e<<endl;
  304.                 if(ptr->leftChild != NULL)
  305.                         que.push(ptr->leftChild);
  306.                 if(ptr->rightChild != NULL)
  307.                         que.push(ptr->rightChild);
  308.         }
  309. }
  310. template<typename Type> BSTrees<Type>::~BSTrees()
  311. {
  312.         clear();
  313. }
  314. #endif
复制代码
main.cpp
  1. //main.cpp
  2. #include <iostream>
  3. #include "BST.h"
  4. using namespace std;


  5. void main()
  6. {
  7.         BSTrees<int>Bst;
  8.         int Arr[9] = {6,2,8,4,10,0,12,16,14};
  9.         for (int i=0;i<9;i++)
  10.                 Bst.insert(Arr[i]);
  11.         Bst.traverse(Bst.getRoot());
  12.         cout<<"Tree'slength is:"<<Bst.getLength()<<endl;
  13.         Bst.traverseLevel(Bst.getRoot());
  14. }
复制代码
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 21:18 , Processed in 0.036365 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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