亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP實現的線索二叉樹及二叉樹遍歷方法詳解

2024-05-04 23:45:13
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP實現的線索二叉樹及二叉樹遍歷方法,結合實例形式較為詳細的分析了線索二叉樹的定義,創建,判斷與遍歷等技巧,需要的朋友可以參考下
 

本文實例講述了PHP實現的線索二叉樹及二叉樹遍歷方法。分享給大家供大家參考,具體如下:

<?php  require 'biTree.php';  $str = 'ko#be8#tr####acy#####';  $tree = new BiTree($str);  $tree->createThreadTree();  echo $tree->threadList() . "/n";從第一個結點開始遍歷線索二叉樹  echo $tree->threadListReserv();從最后一個結點開始反向遍歷?>

biTree.php:

<?  /**   * PHP實現二叉樹   *   * @author zhaojiangwei   * @since 2011/10/25 10:32   */  //結點類  class Node{    private $data = NULL;    private $left = NULL;    private $right = NULL;    private $lTag = 0;    private $rTag = 0;    public function Node($data = false){      $this->data = $data;    }    //我不喜歡使用魔術方法    public function getData(){      return $this->data;    }    public function setData($data){      $this->data = $data;    }    public function getLeft(){      return $this->left;    }    public function setLeft($left){      $this->left = $left;    }    public function getRight(){      return $this->right;    }    public function setRight($right){      $this->right = $right;    }    public function getLTag(){      return $this->lTag;    }    public function setLTag($tag){      $this->lTag = $tag;    }    public function getRTag(){      return $this->rTag;    }    public function setRTag($tag){      $this->rTag = $tag;    }  }  //線索二叉樹類  class BiTree{    private $datas = NULL;//要導入的字符串;    private $root = NULL; //根結點    private $leafCount = 0;//葉子結點個數    private $headNode = NULL; //線索二叉樹的頭結點    private $preNode = NULL;//遍歷線索化二叉樹時保存前一個遍歷的結點    public function BiTree($datas){      is_array($datas) || $datas = str_split($datas);      $this->datas = $datas;      $this->backupData = $this->datas;      $this->createTree(TRUE);    }    //前序遍歷創建樹    //$root 判斷是不是要創建根結點    public function createTree($root = FALSE){      if(emptyempty($this->datas)) return NULL;      $first = array_shift($this->datas);      if($first == '#'){        return NULL;      }else{        $node = new Node($first);        $root && $this->root = $node;        $node->setLeft($this->createTree());        $node->setRight($this->createTree());        return $node;      }    }    //返回二叉樹葉子結點的個數    public function getLeafCount(){      $this->figureLeafCount($this->root);      return $this->leafCount;    }    private function figureLeafCount($node){      if($node == NULL)        return false;      if($this->checkEmpty($node)){        $this->leafCount ++;      }else{        $this->figureLeafCount($node->getLeft());        $this->figureLeafCount($node->getRight());      }    }    //判斷結點是不是葉子結點    private function checkEmpty($node){      if($node->getLeft() == NULL && $node->getRight() == NULL){        return true;      }      return false;    }    //返回二叉樹深度    public function getDepth(){      return $this->traversDepth($this->root);    }    //遍歷求二叉樹深度    public function traversDepth($node){      if($node == NULL){        return 0;      }      $u = $this->traversDepth($node->getLeft()) + 1;      $v = $this->traversDepth($node->getRight()) + 1;      return $u > $v ? $u : $v;    }    //返回遍歷結果,以字符串的形式    //$order 按遍歷形式返回,前中后    public function getList($order = 'front'){      if($this->root == NULL) return NULL;      $nodeList = array();      switch ($order){        case "front":          $this->frontList($this->root, $nodeList);          break;        case "middle":          $this->middleList($this->root, $nodeList);          break;        case "last":          $this->lastList($this->root, $nodeList);          break;        default:          $this->frontList($this->root, $nodeList);          break;      }      return implode($nodeList);    }    //創建線索二叉樹    public function createThreadTree(){      $this->headNode = new Node();      $this->preNode = & $this->headNode;      $this->headNode->setLTag(0);      $this->headNode->setLeft($this->root);      $this->headNode->setRTag(1);      $this->threadTraverse($this->root);      $this->preNode->setRight($this->headNode);      $this->preNode->setRTag(1);      $this->headNode->setRight($this->preNode);    }    //線索化二叉樹    private function threadTraverse($node){      if($node != NULL){        if($node->getLeft() == NULL){          $node->setLTag(1);          $node->setLeft($this->preNode);        }else{          $this->threadTraverse($node->getLeft());        }        if($this->preNode != $this->headNode && $this->preNode->getRight() == NULL){          $this->preNode->setRTag(1);          $this->preNode->setRight($node);        }        $this->preNode = & $node;//注意傳引用        $this->threadTraverse($node->getRight());      }    }    //從第一個結點遍歷中序線索二叉樹    public function threadList(){      $arr = array();      for($node = $this->getFirstThreadNode($this->root); $node != $this->headNode; $node = $this->getNextNode($node)){        $arr[] = $node->getData();      }      return implode($arr);    }    //從尾結點反向遍歷中序線索二叉樹    public function threadListReserv(){      $arr = array();      for($node = $this->headNode->getRight(); $node != $this->headNode; $node = $this->getPreNode($node)){        $arr[] = $node->getData();      }      return implode($arr);    }    //返回某個結點的前驅    public function getPreNode($node){      if($node->getLTag() == 1){        return $node->getLeft();      }else{        return $this->getLastThreadNode($node->getLeft());      }    }    //返回某個結點的后繼    public function getNextNode($node){      if($node->getRTag() == 1){        return $node->getRight();      }else{        return $this->getFirstThreadNode($node->getRight());      }    }    //返回中序線索二叉樹的第一個結點    public function getFirstThreadNode($node){      while($node->getLTag() == 0){        $node = $node->getLeft();      }      return $node;    }    //返回中序線索二叉樹的最后一個結點    public function getLastThreadNode($node){      while($node->getRTag() == 0){        $node = $node->getRight();      }      return $node;    }    //前序遍歷    private function frontList($node, & $nodeList){      if($node !== NULL){        $nodeList[] = $node->getData();        $this->frontList($node->getLeft(), $nodeList);        $this->frontList($node->getRight(), $nodeList);      }    }    //中序遍歷    private function middleList($node, & $nodeList){      if($node != NULL){        $this->middleList($node->getLeft(), $nodeList);        $nodeList[] = $node->getData();        $this->middleList($node->getRight(), $nodeList);      }    }    //后序遍歷    private function lastList($node, & $nodeList){      if($node != NULL){        $this->lastList($node->getLeft(), $nodeList);        $this->lastList($node->getRight(), $nodeList);        $nodeList[] = $node->getData();      }    }    public function getData(){      return $this->data;    }    public function getRoot(){      return $this->root;    }  }?>
 


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频在线免费观看| 成人免费福利视频| 日韩一区二区在线视频| 亚洲品质视频自拍网| 国产亚洲精品美女久久久| 亚洲va欧美va国产综合久久| 亚洲黄色av女优在线观看| 久久久久久久久久婷婷| 久久久久久亚洲精品不卡| 亚洲男人的天堂在线播放| 日韩免费高清在线观看| 97视频免费在线观看| 精品美女国产在线| 欧美性做爰毛片| 成人黄色影片在线| 91在线|亚洲| 欧美另类第一页| 国产在线一区二区三区| 久久久久久91| 欧美中文字幕精品| 91啪国产在线| 久久偷看各类女兵18女厕嘘嘘| 日韩有码在线观看| 日韩欧美在线视频免费观看| 成人写真视频福利网| 在线观看国产欧美| 欧美韩国理论所午夜片917电影| 国产精品久久久久久久av大片| 亚洲国产又黄又爽女人高潮的| 日韩精品免费在线视频| 精品久久久一区二区| 国产伦精品一区二区三区精品视频| 在线观看国产精品91| 久久青草精品视频免费观看| 美女精品视频一区| 最近2019中文字幕第三页视频| 国产精品嫩草影院久久久| 热久久这里只有精品| 高清日韩电视剧大全免费播放在线观看| 高清一区二区三区四区五区| 久久国产色av| 久热99视频在线观看| 中文字幕日韩免费视频| 88国产精品欧美一区二区三区| 一区二区av在线| 精品福利在线视频| 亚洲精品日韩久久久| 亚洲欧美精品suv| 色综合久久中文字幕综合网小说| 国产精品18久久久久久首页狼| 欧美中文字幕视频| 国产日韩欧美在线视频观看| 国产精品爱啪在线线免费观看| 欧美日本在线视频中文字字幕| 欧美日韩精品中文字幕| 亚洲成人三级在线| 国产婷婷成人久久av免费高清| 一区二区三区日韩在线| 亚洲影院色在线观看免费| 亚洲精品国产电影| 国产中文欧美精品| 91香蕉亚洲精品| 日韩视频一区在线| 精品高清一区二区三区| 亚洲www永久成人夜色| 亚洲欧美国产va在线影院| 国产一区av在线| 国产精品无av码在线观看| 久久精品中文字幕一区| 国产精品无码专区在线观看| 亚洲国产日韩欧美在线图片| 久久精品视频免费播放| 欧美性高跟鞋xxxxhd| www.日韩免费| 亚洲欧美日韩成人| 日本一欧美一欧美一亚洲视频| 亚洲石原莉奈一区二区在线观看| 91精品国产综合久久久久久蜜臀| 久久69精品久久久久久久电影好| 欧洲精品久久久| 秋霞av国产精品一区| 亚洲第五色综合网| 日韩精品在线观看一区| 国产精品久久久久久搜索| 亚洲欧洲日产国码av系列天堂| 日韩av一区二区在线观看| 欧美高跟鞋交xxxxhd| 97在线观看视频| 国产精品久久久久999| 富二代精品短视频| 久久久久久久亚洲精品| 国产成人jvid在线播放| 国产精品成人va在线观看| 欧美午夜精品久久久久久浪潮| 国产精品中文在线| 成人动漫网站在线观看| 亚洲第一精品夜夜躁人人躁| 国产成人精品视频在线观看| 亚洲有声小说3d| 欧美国产欧美亚洲国产日韩mv天天看完整| 91久久久久久久| 欧美综合国产精品久久丁香| 欧美性极品少妇精品网站| 91国产视频在线| www.久久色.com| 精品少妇一区二区30p| 欧美成年人视频| 亚洲欧美日韩精品久久亚洲区| 久久久国产精品x99av| 久久影视电视剧免费网站| 欧美一区二区大胆人体摄影专业网站| 欧美亚洲激情在线| 91精品国产高清久久久久久| 狠狠久久五月精品中文字幕| 国产午夜精品全部视频在线播放| 欧美在线亚洲一区| 久久福利视频导航| 亚洲性日韩精品一区二区| 久久99久久亚洲国产| 国产视频综合在线| 国产美女高潮久久白浆| 欧美一级视频一区二区| 欧洲成人性视频| 欧美视频在线观看免费| 国产精品福利久久久| 色妞色视频一区二区三区四区| 久久亚洲国产精品| 国产精品18久久久久久麻辣| 国产精品成久久久久三级| 一区二区三区视频观看| 精品福利一区二区| 亚洲人成电影在线观看天堂色| 久久久亚洲影院你懂的| 少妇av一区二区三区| 亚洲福利影片在线| 4444欧美成人kkkk| 亚洲夜晚福利在线观看| 欧美国产亚洲精品久久久8v| 欧美伊久线香蕉线新在线| 国产精品稀缺呦系列在线| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲人成五月天| 亚洲人成电影网站色xx| 国产成人精彩在线视频九色| 欧美日韩在线视频首页| 亚洲香蕉在线观看| 欧美在线观看网址综合| 日韩精品极品在线观看播放免费视频| 海角国产乱辈乱精品视频| 欧美电影免费在线观看| 色婷婷**av毛片一区| 91精品啪在线观看麻豆免费| 久久久久久伊人| 91亚洲国产成人久久精品网站| 欧美成人sm免费视频| 亚洲免费av电影| 国产亚洲精品va在线观看| 久久亚洲精品一区| 亚洲精品福利免费在线观看| 国产精品一区二区久久| 亚洲精品美女久久久| 欧洲成人午夜免费大片| 久久精彩免费视频| 欧美夫妻性生活视频|