⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printbtree.h

📁 打印二叉树 详细的更直观的打印 可以帮助学习二叉树 对初学者又很大的益处
💻 H
字号:
#include<cmath>
#include<iostream>
#include "Trees.h"
#define all 100
//进行先序搜索,结果保存到place[]里,同时记下树的高度*ph,便于按高度调整打印的间距 
//loc为节点要保存的地址,为place[loc]
//place[]中存的节点是以层遍历从上到下的,这就可以用类似堆的模式存节点 
void search(struct Btnode* ptr, char* place, int ht, int loc, int* ph)
{
   place[loc]=ptr->data_;
   if(ht>*ph)//如果高度超过现有高度 
      *ph=ht;//更新高度 
   if(ptr->lc_!=0)//有左子 
      search(ptr->lc_, place, ht+1, loc*2, ph);//搜左子,并将左子保存在place[loc*2] 
   if(ptr->rc_!=0)//有右子 
      search(ptr->rc_, place, ht+1, loc*2+1, ph);//搜右子,并将左子保存在place[loc*2+1]
}
void printBTree(struct Btnode* ptr)
{ 
   char place[all];
   int height=1, n, i, floor, j; 
   for(i=1;i<=all;i++)//初始化为0 
      place[i]=0;
   search(ptr, place, 1, 1, &height);//遍历树,height保存树的高度 
   n=(int)pow(2,height)-1;//最多有pow(2,height)-1个节点 
   floor=1;//当前所在层数 
   for(i=1;i<=n;i++)//打印节点 
   {
      if(place[i]==0)//节点不存在 
         for(j=1;j<=(int)pow(2,height+2-floor)-1;j++)//按高度打印空格 
            std::cout<<" ";
      else//节点存在
      {
         if(i*2<=n&&place[i*2]!=0)//有左子 
         {
            for(j=1;j<=(int)pow(2,height-floor)-1;j++)//按高度打印空格
               std::cout<<" ";
            std::cout<<".";//打印连接子节点的"枝干"
            for(j=1;j<=(int)pow(2,height-floor)-1;j++)//打印连接子节点的"枝干"
               std::cout<<"-";
         }
         else//没有左子 
            for(j=1;j<=(int)pow(2,height-floor+1)-1;j++)//按高度打印空格 
               std::cout<<" ";
               
         std::cout<<place[i];
         
         if(i*2<=n&&place[i*2+1]!=0)//有右子 
         {
            for(j=1;j<=(int)pow(2,height-floor)-1;j++)//打印连接子节点的"枝干"
               std::cout<<"-";
            std::cout<<".";//打印连接子节点的"枝干"
            for(j=1;j<=(int)pow(2,height-floor)-1;j++)
               std::cout<<" ";
         }
         else//没有右子 
            for(j=1;j<=(int)pow(2,height-floor+1)-1;j++)//按高度打印空格 
               std::cout<<" ";
      }
      std::cout<<" ";
      
      if(i==(int)pow(2,floor)-1)//打印完一层,换行 
      {
         std::cout<<std::endl;
         floor++;
      }
   }
   std::cout<<"\n";
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -