中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

PHP實現(xiàn)的線索二叉樹及二叉樹遍歷方法詳解
來源:易賢網(wǎng) 閱讀:1444 次 日期:2016-08-26 14:36:27
溫馨提示:易賢網(wǎng)小編為您整理了“PHP實現(xiàn)的線索二叉樹及二叉樹遍歷方法詳解”,方便廣大網(wǎng)友查閱!

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

<?php

  require 'biTree.php';

  $str = 'ko#be8#tr####acy#####';

  $tree = new BiTree($str);

  $tree->createThreadTree();

  echo $tree->threadList() . "\n";從第一個結(jié)點開始遍歷線索二叉樹

  echo $tree->threadListReserv();從最后一個結(jié)點開始反向遍歷

?>

biTree.php:

<?

  /**

   * PHP實現(xiàn)二叉樹

   *

   * @author zhaojiangwei

   * @since 2011/10/25 10:32

   */

  //結(jié)點類

  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;

    }

    //我不喜歡使用魔術(shù)方法

    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;//要導(dǎo)入的字符串;

    private $root = NULL; //根結(jié)點

    private $leafCount = 0;//葉子結(jié)點個數(shù)

    private $headNode = NULL; //線索二叉樹的頭結(jié)點

    private $preNode = NULL;//遍歷線索化二叉樹時保存前一個遍歷的結(jié)點

    public function BiTree($datas){

      is_array($datas) || $datas = str_split($datas);

      $this->datas = $datas;

      $this->backupData = $this->datas;

      $this->createTree(TRUE);

    }

    //前序遍歷創(chuàng)建樹

    //$root 判斷是不是要創(chuàng)建根結(jié)點

    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;

      }

    }

    //返回二叉樹葉子結(jié)點的個數(shù)

    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());

      }

    }

    //判斷結(jié)點是不是葉子結(jié)點

    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;

    }

    //返回遍歷結(jié)果,以字符串的形式

    //$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);

    }

    //創(chuàng)建線索二叉樹

    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());

      }

    }

    //從第一個結(jié)點遍歷中序線索二叉樹

    public function threadList(){

      $arr = array();

      for($node = $this->getFirstThreadNode($this->root); $node != $this->headNode; $node = $this->getNextNode($node)){

        $arr[] = $node->getData();

      }

      return implode($arr);

    }

    //從尾結(jié)點反向遍歷中序線索二叉樹

    public function threadListReserv(){

      $arr = array();

      for($node = $this->headNode->getRight(); $node != $this->headNode; $node = $this->getPreNode($node)){

        $arr[] = $node->getData();

      }

      return implode($arr);

    }

    //返回某個結(jié)點的前驅(qū)

    public function getPreNode($node){

      if($node->getLTag() == 1){

        return $node->getLeft();

      }else{

        return $this->getLastThreadNode($node->getLeft());

      }

    }

    //返回某個結(jié)點的后繼

    public function getNextNode($node){

      if($node->getRTag() == 1){

        return $node->getRight();

      }else{

        return $this->getFirstThreadNode($node->getRight());

      }

    }

    //返回中序線索二叉樹的第一個結(jié)點

    public function getFirstThreadNode($node){

      while($node->getLTag() == 0){

        $node = $node->getLeft();

      }

      return $node;

    }

    //返回中序線索二叉樹的最后一個結(jié)點

    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程序設(shè)計有所幫助。

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:PHP實現(xiàn)的線索二叉樹及二叉樹遍歷方法詳解
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機(jī)站點

版權(quán)所有:易賢網(wǎng)

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
**网站欧美大片在线观看| 99久精品国产| 国产色一区二区| 欧美一级二级三级乱码| 91高清在线观看| fc2成人免费人成在线观看播放| 午夜国产精品影院在线观看| 亚洲va国产天堂va久久en| 一区二区三区丝袜| 三级亚洲高清视频| 国内精品久久久久影院色| 成人精品视频一区二区三区尤物| 福利一区福利二区| 色菇凉天天综合网| 67194成人在线观看| 久久久久久电影| 亚洲男人天堂av| 国产一区二区三区久久久| 99精品视频中文字幕| 666欧美在线视频| 欧美经典三级视频一区二区三区| 亚洲人一二三区| 国产夫妻精品视频| 奇米影视一区二区三区| 麻豆精品在线观看| 久久99九九99精品| 欧美在线观看视频一区二区| 国产网站一区二区三区| 午夜视频在线观看一区二区三区| 精品亚洲国内自在自线福利| 欧美亚洲日本一区| 中文字幕二三区不卡| 国模无码大尺度一区二区三区| 99国产精品久久久| 国产精品成人在线观看| 国产一区二区三区免费在线观看| 欧美久久一二三四区| 一区二区三区欧美日| 99精品久久免费看蜜臀剧情介绍| 99精品桃花视频在线观看| 中文字幕欧美日本乱码一线二线| 国产麻豆视频一区| 久久久久国色av免费看影院| 喷水一区二区三区| 精品国产成人在线影院| 国产精品亚洲成人| 日本一区二区三区国色天香| 国产传媒欧美日韩成人| 亚洲精品在线网站| 国产精品99久久久| 亚洲人成精品久久久久久| 色综合一区二区三区| 一个色妞综合视频在线观看| 91在线国产福利| 91精品国产入口在线| 美女脱光内衣内裤视频久久影院| 99re热视频精品| 一区二区视频在线| 日韩亚洲欧美综合| 成人激情视频网站| 久久99蜜桃精品| 亚洲视频小说图片| 欧美一级国产精品| 一本高清dvd不卡在线观看| 日韩av在线播放中文字幕| 国产精品久久久久久久久免费桃花| 91国偷自产一区二区开放时间 | 国产精品一区二区x88av| 一区二区三区在线免费观看| 欧美亚洲尤物久久| 欧美日韩国产精品成人| 成人激情图片网| 成人午夜又粗又硬又大| 精品一区二区在线播放| 五月开心婷婷久久| 一区二区三区久久久| 中文字幕佐山爱一区二区免费| 久久人人97超碰com| 日韩亚洲欧美综合| 777奇米四色成人影色区| 欧美日韩国产免费一区二区| 色偷偷成人一区二区三区91| 成人深夜视频在线观看| 成人免费视频一区| 粉嫩av一区二区三区粉嫩 | 亚洲高清不卡在线观看| 亚洲午夜av在线| 免费视频最近日韩| 国产美女一区二区| www.色综合.com| 欧美日韩三级一区| 日韩一区二区免费在线电影| 欧美精品一区二区在线播放| 国产三级一区二区| 一区二区三区在线免费视频 | 精品一二线国产| 北条麻妃国产九九精品视频| 色综合久久久久久久久久久| 91福利在线观看| 欧美va天堂va视频va在线| 1区2区3区欧美| 美女网站色91| 欧美在线观看视频一区二区| 久久色.com| 人人超碰91尤物精品国产| 国产成人日日夜夜| 9191精品国产综合久久久久久 | 亚洲欧美在线视频观看| 五月天视频一区| 色视频一区二区| 久久精品亚洲麻豆av一区二区| 亚洲一区二区三区四区五区中文| 国产精品亚洲午夜一区二区三区 | 国产精一品亚洲二区在线视频| 青娱乐精品在线视频| jiyouzz国产精品久久| 日韩欧美国产综合一区| 亚洲精品国产精品乱码不99| 国产精品一线二线三线精华| 日韩一区二区免费电影| 亚洲综合男人的天堂| 99久久精品免费| 久久精子c满五个校花| 免费在线看一区| 日韩欧美成人激情| 激情综合网最新| 国产日韩欧美麻豆| 99久久国产综合精品女不卡| 国产精品色在线| 色综合色狠狠天天综合色| 亚洲女与黑人做爰| 欧美日韩国产精品成人| 日本亚洲天堂网| 国产欧美中文在线| 波多野结衣中文一区| 亚洲欧美日韩国产一区二区三区| 色婷婷国产精品久久包臀| 婷婷亚洲久悠悠色悠在线播放| 日韩免费一区二区三区在线播放| 国产精品亚洲专一区二区三区| 中文字幕字幕中文在线中不卡视频| 色综合天天天天做夜夜夜夜做| 亚洲成人高清在线| 国产精品久久久久7777按摩| 日韩一级片网站| 欧美日韩在线播放| 成人精品小蝌蚪| 国产在线一区观看| 蜜臀av亚洲一区中文字幕| 亚洲人午夜精品天堂一二香蕉| 日韩欧美国产三级| 7799精品视频| 欧美日韩高清影院| 欧洲av一区二区嗯嗯嗯啊| 99久久99久久综合| 成人av在线影院| 国产91精品露脸国语对白| 久久国产生活片100| 六月丁香婷婷久久| 美洲天堂一区二卡三卡四卡视频 | 极品少妇xxxx精品少妇| 日本aⅴ亚洲精品中文乱码| 亚洲国产一区二区视频| 国产清纯在线一区二区www| 日韩一二三四区| 日韩欧美国产三级电影视频| 国产剧情在线观看一区二区| 久久精品免费观看| 国产偷国产偷精品高清尤物| 欧美精品自拍偷拍| 精品写真视频在线观看| 日韩高清欧美激情| 免费成人在线网站| 成人午夜大片免费观看| 精品亚洲aⅴ乱码一区二区三区| 一区二区三区小说| 日韩福利电影在线| 免费国产亚洲视频| 久久国产尿小便嘘嘘| 日韩精品色哟哟| 成人动漫一区二区三区| 成人av网站在线观看免费| 成人免费高清在线| 欧美日韩高清影院| 在线成人av影院| 久久久不卡网国产精品一区| 亚洲已满18点击进入久久| 三级久久三级久久久| 国产在线一区二区| 欧美午夜电影在线播放| 久久麻豆一区二区| 亚洲精品日韩综合观看成人91| 亚洲午夜一二三区视频| 国产一区二区不卡| 91猫先生在线| 欧美成人一区二区三区在线观看 | 一区二区理论电影在线观看| 蜜桃一区二区三区四区| 成人理论电影网| 国产91丝袜在线18|