pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

PHP實現繪制二叉樹圖形顯示功能詳解【包括二叉搜索樹、平衡樹及紅黑樹】

這篇文章主要介紹了PHP實現繪制二叉樹圖形顯示功能,結合實例形式分析了php繪制常見二叉樹的相關操作技巧,包括二叉搜索樹、平衡樹及紅黑樹的實現方法,需要的朋友可以參考下

本文實例講述了PHP實現繪制二叉樹圖形顯示功能。分享給大家供大家參考,具體如下:

前言:

最近老師布置了一個作業:理解并實現平衡二叉樹和紅黑樹,本來老師是說用C#寫的,但是我學的C#基本都還給老師了,怎么辦?那就用現在最熟悉的語言PHP來寫吧!

有一個問題來了,書上在講解樹的時候基本上會給出形象的樹形圖。但是當我們自己試著實現某種樹,在調試、輸出的時候確只能以字符的形式順序地輸出。這給調試等方面帶來了很大的不便。然后在各種百度之后,我發現利用PHP實現二叉樹的圖形顯示的資源幾乎是零!好吧,那我就自己個兒實現一個!

效果顯示:

如果我是直接在這一步擺代碼的話,估計大家會比較煩悶,那我就直接上結果吧,后面在補代碼,先激發激發大家的閱讀興趣:

1、搜索二叉樹:

PHP實現繪制二叉樹圖形顯示功能詳解【包括二叉搜索樹、平衡樹及紅黑樹】

2、平衡二叉樹:

PHP實現繪制二叉樹圖形顯示功能詳解【包括二叉搜索樹、平衡樹及紅黑樹】

3、紅黑樹:

PHP實現繪制二叉樹圖形顯示功能詳解【包括二叉搜索樹、平衡樹及紅黑樹】

上代碼:

我們給圖片創建一個類吧,顯得稍微的小高級:

image.php 文件:

<?php
/**
 * author:LSGOZJ
 * description: 繪制二叉樹圖像
 */
class image
{
  //樹相關設置
  //每層之間的間隔高度
  private $level_high = 100;
  //最底層葉子結點之間的寬度
  private $leaf_width = 50;
  //結點圓的半徑
  private $rad = 20;
  //根節點離邊框頂端距離
  private $leave = 20;
  //樹(保存樹對象的引用)
  private $tree;
  //樹的層數
  private $level;
  //完全二叉樹中最底層葉子結點數量(計算圖像寬度時用到,論如何實現圖片大小自適應)
  private $maxCount;
  //圖像相關設置
  //畫布寬度
  private $width;
  //畫布高度
  private $height;
  //畫布背景顏色(RGB)
  private $bg = array(
    220, 220, 220
  );
  //節點顏色(搜索二叉樹和平衡二叉樹時用)
  private $nodeColor = array(
    255, 192, 203
  );
  //圖像句柄
  private $image;
  /**
   * 構造函數,類屬性初始化
   * @param $tree 傳遞一個樹的對象
   * @return null
   */
  public function __construct($tree)
  {
    $this->tree = $tree;
    $this->level = $this->getLevel();
    $this->maxCount = $this->GetMaxCount($this->level);
    $this->width = ($this->rad * 2 * $this->maxCount) + $this->maxCount * $this->leaf_width;
    $this->height = $this->level * ($this->rad * 2) + $this->level_high * ($this->level - 1) + $this->leave;
    //1.創建畫布
    $this->image = imagecreatetruecolor($this->width, $this->height); //新建一個真彩色圖像,默認背景是黑色
    //填充背景色
    $bgcolor = imagecolorallocate($this->image, $this->bg[0], $this->bg[1], $this->bg[2]);
    imagefill($this->image, 0, 0, $bgcolor);
  }
  /**
   * 返回傳進來的樹對象對應的完全二叉樹中最底層葉子結點數量
   * @param $level 樹的層數
   * @return 結點數量
   */
  function GetMaxCount($level)
  {
    return pow(2, $level - 1);
  }
  /**
   * 獲取樹對象的層數
   * @param null
   * @return 樹的層數
   */
  function getLevel()
  {
    return $this->tree->Depth();
  }
  /**
   * 顯示二叉樹圖像
   * @param null
   * @return null
   */
  public function show()
  {
    $this->draw($this->tree->root, 1, 0, 0);
    header("Content-type:image/png");
    imagepng($this->image);
    imagedestroy($this->image);
  }
  /**
   * (遞歸)畫出二叉樹的樹狀結構
   * @param $root,根節點(樹或子樹) $i,該根節點所處的層 $p_x,父節點的x坐標 $p_y,父節點的y坐標
   * @return null
   */
  private function draw($root, $i, $p_x, $p_y)
  {
    if ($i <= $this->level) {
      //當前節點的y坐標
      $root_y = $i * $this->rad + ($i - 1) * $this->level_high;
      //當前節點的x坐標
      if (!is_null($parent = $root->parent)) {
        if ($root == $parent->left) {
          $root_x = $p_x - $this->width / (pow(2, $i));
        } else {
          $root_x = $p_x + $this->width / (pow(2, $i));
        }
      } else {
        //根節點
        $root_x = (1 / 2) * $this->width;
        $root_y += $this->leave;
      }
      //畫結點(確定所畫節點的類型(平衡、紅黑、排序)和方法)
      $method = 'draw' . get_class($this->tree) . 'Node';
      $this->$method($root_x, $root_y, $root);
      //將當前節點和父節點連線(黑色線)
      $black = imagecolorallocate($this->image, 0, 0, 0);
      if (!is_null($parent = $root->parent)) {
        imageline($this->image, $p_x, $p_y, $root_x, $root_y, $black);
      }
      //畫左子節點
      if (!is_null($root->left)) {
        $this->draw($root->left, $i + 1, $root_x, $root_y);
      }
      //畫右子節點
      if (!is_null($root->right)) {
        $this->draw($root->right, $i + 1, $root_x, $root_y);
      }
    }
  }
  /**
   * 畫搜索二叉樹結點
   * @param $x,當前節點的x坐標 $y,當前節點的y坐標 $node,當前節點的引用
   * @return null
   */
  private function drawBstNode($x, $y, $node)
  {
    //節點圓的線顏色
    $black = imagecolorallocate($this->image, 0, 0, 0);
    $nodeColor = imagecolorallocate($this->image, $this->nodeColor[0], $this->nodeColor[1], $this->nodeColor[2]);
    //畫節點圓
    imageellipse($this->image, $x, $y, $this->rad * 2, $this->rad * 2, $black);
    //節點圓顏色填充
    imagefill($this->image, $x, $y, $nodeColor);
    //節點對應的數字
    imagestring($this->image, 4, $x, $y, $node->key, $black);
  }
  /**
   * 畫平衡二叉樹結點
   * @param $x,當前節點的x坐標 $y,當前節點的y坐標 $node,當前節點的引用
   * @return null
   */
  private function drawAvlNode($x, $y, $node)
  {
    $black = imagecolorallocate($this->image, 0, 0, 0);
    $nodeColor = imagecolorallocate($this->image, $this->nodeColor[0], $this->nodeColor[1], $this->nodeColor[2]);
    imageellipse($this->image, $x, $y, $this->rad * 2, $this->rad * 2, $black);
    imagefill($this->image, $x, $y, $nodeColor);
    imagestring($this->image, 4, $x, $y, $node->key . '(' . $node->bf . ')', $black);
  }
  /**
   * 畫紅黑樹結點
   * @param $x,當前節點的x坐標 $y,當前節點的y坐標 $node,當前節點的引用
   * @return null
   */
  private function drawRbtNode($x, $y, $node)
  {
    $black = imagecolorallocate($this->image, 0, 0, 0);
    $gray = imagecolorallocate($this->image, 180, 180, 180);
    $pink = imagecolorallocate($this->image, 255, 192, 203);
    imageellipse($this->image, $x, $y, $this->rad * 2, $this->rad * 2, $black);
    if ($node->IsRed == TRUE) {
      imagefill($this->image, $x, $y, $pink);
    } else {
      imagefill($this->image, $x, $y, $gray);
    }
    imagestring($this->image, 4, $x, $y, $node->key, $black);
  }
}

好,現在我們來看看在客戶端如何調用:

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP定義字符串的四種方式,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
下面小編就為大家分享一篇php 替換文章中的圖片路徑,下載圖片到本地服務器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP給源代碼加密的幾種方法匯總(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇php打開本地exe程序,js打開本地exe應用程序,并傳遞相關參數方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP類的反射來實現依賴注入過程以及相關知識點分享,對此有興趣的朋友跟著小編學習下吧。
php遍歷一個文件夾內的所有文件和文件夾,并刪除所有文件夾和子文件夾下的所有文件的代碼,通過遞歸方式實現達到清空一個目錄的效果。本文給大家分享實例代碼,需要的朋友參考
主站蜘蛛池模板: 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 东莞办公家具厂家直销-美鑫【免费3D效果图】全国办公桌/会议桌定制 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 气胀轴|气涨轴|安全夹头|安全卡盘|伺服纠偏系统厂家-天机传动 | 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 杭州翻译公司_驾照翻译_专业人工翻译-杭州以琳翻译有限公司官网 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 | 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 无缝方管|无缝矩形管|无缝方矩管|无锡方管厂家 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 顶呱呱交易平台-行业领先的公司资产交易服务平台 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 礼堂椅厂家|佛山市艺典家具有限公司 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | 广东西屋电气有限公司-广东西屋电气有限公司 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 深圳市超时尚职业培训学校,培训:月嫂,育婴,养老,家政;化妆,美容,美发,美甲. | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 |