当前位置: 首页 > 后端技术 > PHP

4.2数据结构(PHP实现)——二叉搜索树遍历(递归实现)

时间:2023-03-29 19:29:48 PHP

1.遍历原理前序遍历:先遍历当前节点,再遍历当前节点的左儿子,最后遍历当前节点的右儿子中序遍历:先遍历当前节点的左儿子,然后遍历当前节点,最后遍历当前节点的右儿子后续遍历:先遍历当前节点的左儿子,再遍历当前节点的右儿子,最后遍历当前节点2.前序遍历图3.中序遍历图4.后序遍历图5.二叉搜索树递归遍历的实现this->rootNode=null;;}/***二叉树的根节点*@varNode*/protected$rootNode;/***获取根节点*@returnNode*/publicfunctiongetRootNode():Node{return$this->rootNode;}/***二叉树的数量*@varint*/protected$size;/***获取二叉树的元素个数*@returnint*/publicfunctiongetSize():int{return$this->size;}/***判断是否为空*@returnbool*/publicfunctionisEmpty():bool{return$this->size==0;}/***插入节点*@parammixed$value*@returnvoid*/publicfunactionadd($value):void{//如果没有根节点则插入根节点if(is_null($this->rootNode)){$this->rootNode=newNode($value);$这个->尺寸;返回;}else{$this->addChild($value,$this->rootNode);返回;}}/***插入子节点*@parammixed$value*@paramNode|null$parentNode*/privatefunctionaddChild($value,?Node$parentNode):void{if(bccomp($parentNode->getValue(),$value)>0){//左子节点if(is_null($parentNode->getLeftChild())){$parentNode->setLeftChild(newNode($value));$这个->尺寸++;返回;}else{$this->addChild($value,$parentNode->getLeftChild());}}elseif(bccomp($parentNode->getValue(),$value)<0){//右子if(is_null($parentNode->getRightChild())){$parentNode->setRightChild(新节点($value));$这个->尺寸++;返回;}else{$this->addChild($value,$parentNode->getRightChild());}}else{返回;}}constTRAVERSAL_PREORDER=1;//先序遍历constTRAVERSAL_INORDER=2;//中序遍历constTRAVERSAL_POSTORDER=3;//后序遍历/***遍历二叉树*@paramint$traversalType*@returnstring*/publicfunctiontraversal(int$traversalType=1):string{$result='';switch($traversalType){caseself::TRAVERSAL_PREORDER:$this->preorderTraversal($result,$this->rootNode);}休息;案例self::TRAVERSAL_INORDER:$this->inorderTraversal($result,$this->rootNode);休息;案例self::TRAVERSAL_POSTORDER:$this->postorderTraversal($result,$this->rootNode);休息;默认值:中断;}返回$结果;}/***前序遍历*@paramstring$result结果值*@paramNode|null$nodenode*@returnvoid*/protectedfunctionpreorderTraversal(string&$result,?Node$node):void{if(is_null($node))返回;//拼接if($result!='')$result.='->';//先遍历当前节点$result.=$node->getValue();//然后遍历左儿子$this->preorderTraversal($result,$node->getLeftChild());//遍历右子$this->preorderTraversal($result,$node->getRightChild());返回;}/***前序遍历*@paramstring$result结果值*@paramNode|null$nodenode*@returnvoid*/publicfunctioninorderTraversal(string&$result,?Node$node):void{if(is_null($node))返回;//先遍历左儿子$this->inorderT遍历($result,$node->getLeftChild());//拼接if($result!='')$result.='->';//获取当前节点$result.=$node->getValue();//遍历右孩子$this->inorderTraversal($result,$node->getRightChild());返回;}/***后序遍历*@paramstring$result结果值*@paramNode|null$nodenode*@returnvoid*/publicfunctionpostorderTraversal(string&$result,?Node$node):void{if(is_null($node))返回;//先遍历左儿子$this->postorderTraversal($result,$node->getLeftChild());//遍历右孩子$this->postorderTraversal($result,$node->getRightChild());//拼接if($result!='')$result.='->';//再次获取当前节点$result.=$node->getValue();返回;}}6.demoadd(10);$tree->add(5);$tree->add(15);$tree->add(1);$tree->add(0);$tree->add(2);$tree->add(9);$tree->add(8);$tree->add(11);$tree->add(12);$tree->add(19);$tree->add(18);$tree->add(29);$tree->add(16);$tree->add(17);//前序遍历echo$tree->traversal(TreeBundleBaseBinaryTree::TRAVERSAL_PREORDER).PHP_EOL;//中序遍历echo$tree->traversal(TreeBundleBaseBinaryTree::TRAVERSAL_INORDER).PHP_EOL;//后续遍历echo$tree->traversal(TreeBundleBinaryTree::TRAVERSAL_POSTORDER).PHP_EOL;打印结果:10->5->1->0->2->9->8->15->11->12->19->18->16->17->290->1->2->5->8->9->10->11->12->15->16->17->18->19->290->2->1->8->9->5->12->11->17->16->18->29->19->15->10