我思故我在系列——数据结构NO.16题(题目搜集整理者JULY,非常感谢!!)

来源:互联网 发布:手机拍一寸照的软件 编辑:程序博客网 时间:2024/05/16 08:28

 从“我不行”的枷锁中挣脱出来吧,你就能达到期望的高度。

                                           ——摘自 奥格.曼狄诺《羊皮卷》

第16题

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/\ /\
5 7 9 11
33
输出8 6 10 5 7 9 11。


 这道题的本质是在二元树上实现广度优先遍历.
 利用双端队列的特性:先进先出,后进后出来满足输出顺序的要求
#include <deque>
#include <assert.h>
#include <iostream>
using namespace std;
typedef struct BTreeNode
{
    int Value;
    struct BTreeNode* Leftchild;
    struct BTreeNode* Rightchild;
}Tnode,*Tree;

void PrintFromTopToBottom(BTreeNode *pTreeRoot)
{
  assert(pTreeRoot!=NULL);

  deque<BTreeNode *> dequeTreeNode;
  dequeTreeNode.push_back(pTreeRoot);

 while(dequeTreeNode.size()!=0)
    {
       BTreeNode *pNode = dequeTreeNode.front();
    dequeTreeNode.pop_front();

    cout << pNode->Value << ' ';

    if(pNode->Leftchild)
    dequeTreeNode.push_back(pNode->Leftchild);

    if(pNode->Rightchild)
    dequeTreeNode.push_back(pNode->Rightchild);

      }
}


void addTree(Tree& T, int num)
{
     if(T == NULL)
               {
        T = (BTreeNode *)malloc(sizeof(Tnode));
        T->Value = num;
        T->Leftchild = NULL;
        T->Rightchild = NULL;
            return;
             }
     else if(T->Value > num)
             {
        addTree((T->Leftchild), num);
              }
     else if(T->Value < num)
             {
        addTree((T->Rightchild), num);
             }
     else
             {
        cout << "重复加入同一结点" << endl;
            }
}
int main()
{
    BTreeNode* pRoot = NULL;
    addTree(pRoot, 8);
    addTree(pRoot, 6);
    addTree(pRoot, 5);
    addTree(pRoot, 7);
    addTree(pRoot, 10);
    addTree(pRoot, 9);
    addTree(pRoot, 11);
  PrintFromTopToBottom(pRoot);
  return 0;
}
/*知识扩展:
 * 广度优先搜索(Breadth-First-Search),一般选择用队列来完成;

  从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1、V2、……Vn,

   然后依次访问与V1、V2……Vn相邻且未被访问的顶点。如此继续,找到所要找的顶点或者遍历完整个图。

 * 深度优先搜索(Deep-First-Search),由于要采用返回操作,一般采用的是递归(循环+栈)的方法
 * 深度优先搜索所遵循的策略就是尽可能“深”的在图中进行搜索,对于图中某一个顶点V,如果它还有相邻的顶点(在有向图中就是还有以V为起点的边)且未被访问,则访问此顶点。如果找不到,则返回到上一个顶点。这一过程一直进行直到所有的顶点都被访问为止。 DFS可以搜索出从某一个顶点到另外的一个顶点的所有路径。

 * 广度优先搜索深度优先搜索是搜索策略中最经常用到的两种方法,特别常用于图的搜索.

*/