首页 > 开发 > PHP > 正文

PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历

2024-05-04 22:43:30
字体:
来源:转载
供稿:网友

本文实例讲述了PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)。分享给大家供大家参考,具体如下:

前言:

深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下:

前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点

广度优先遍历:又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。

例如对于一下这棵树:

深度优先遍历:

前序遍历:10 8 7 9 12 11 13
中序遍历:7 8 9 10 11 12 13
后序遍历:7 9 8 11 13 12 10

广度优先遍历:

层次遍历:10 8 12 7 9 11 13

二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。

深度优先遍历:

1、前序遍历:

/*** 前序遍历(递归方法)*/private function pre_order1($root){    if (!is_null($root)) {      //这里用到常量__FUNCTION__,获取当前函数名,好处是假如修改函数名的时候,里面的实现不用修改      $function = __FUNCTION__;      echo $root->key . " ";      $this->$function($root->left);      $this->$function($root->right);    }}/*** 前序遍历(非递归方法)* 因为当遍历过根节点之后还要回来,所以必须将其存起来。考虑到后进先出的特点,选用栈存储。*/private function pre_order2($root){    //    $stack = new splstack();    //    $stack->push($root);    //    while(!$stack->isEmpty()){    //      $node = $stack->pop();    //      echo $node->key.' ';    //      if(!is_null($node->right)){    //        $stack->push($node->right);    //      }    //      if(!is_null($node->left)){    //        $stack->push($node->left);    //      }    //    }    if (is_null($root)) {      return;    }    $stack = new splstack();    $node = $root;    while (!is_null($node) || !$stack->isEmpty()) {      while (!is_null($node)) {        //只要结点不为空就应该入栈保存,与其左右结点无关        $stack->push($node);        echo $node->key . ' ';        $node = $node->left;      }      $node = $stack->pop();      $node = $node->right;    }}//前序遍历public function PreOrder(){    // 所在对象中的tree属性保存了一个树的引用    //   $this->pre_order1($this->tree->root);    $this->pre_order2($this->tree->root);}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表