首页 > 编程语言 >PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作

PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作

时间:2022-11-25 13:00:13浏览次数:35  
标签:node 遍历 center 中序 右子 二叉树 array stack 先序


/**
 * PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作
 *          A
 *       B      C
 *    D    E  F     G
 *  H  
  * 先序遍历:先遍历根节点,然后遍历左节点,最后遍历右节点: ABDHECFG 
 * 中序遍历:先遍历左子树,然后遍历根节点,最后遍历右子树:  HDBEAFCG
 * 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点: HDEBFGCA
 *  */


/*先序遍历:利用栈的先进后出特性,先访问根节点,再把右子树压入,再压入左子树.这样取出的时候是先取出左子树,最后取出右子树*/
  function preOrder($root){
  $stack = array();
  array_push($stack,$root);
  while(!empty($stack)){
  $center_node = array_pop($stack);
  echo $center_node->value;//根节点
  if($center_node->right != null){
  array_push($stack,$center_node->right);//压入右子树
  }
  if($center_node->left != null){
  array_push($stack,$center_node->left);//压入左子树
  }
  }
  }


  /*中序遍历:需要从下向上遍历,所以先把左子树压入栈,然后逐个访问根节点和右子树*/
 function inOrder($root){
  $stack = array();
  $center_node = $root;
  while(!empty($stack) || $center_node != null){
      while($center_node != null ){
      array_push($stack,$center_node);
      $center_node = $center_node->left;
      }
      $center_node = array_pop($stack);
      echo $center_node->value;
      $center_node = $center_node->right;
  }
 }


 /*后序遍历:先把根节点存起来,然后依次存储左子树和右子树,然后输出*/


 function tailOrder($root){
  $stack = array();
  $outStack = array();
  array_push($$stack, $root);
  while($empty($stack)){
  $center_node = array_pop($stack);
  array_push($outStack,$center_node);
  if($center_node->right != null){
  array_push($stack,$center_node->left);
  }
  }
  while($empty($outStack)){
  echo $center_node->value;
  }
 }

标签:node,遍历,center,中序,右子,二叉树,array,stack,先序
From: https://blog.51cto.com/u_13940603/5886383

相关文章

  • leetcode 104. 二叉树的最大深度 js实现
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null......
  • 二叉树
    一、基本概念二叉树的性质:性质1:一棵非空二叉树的第i层上至多有2i-1个结点(i>1)。性质2:深度为h的二叉树至多有2h-1个结点(h>1)。(证明):根据性质1,二叉树中所有节点数为20+21+.........
  • LeetCode[124] 二叉树中的最大路径和
    https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/dp,树上搜索因为值有负数,所以针对一个节点的更新,有四种情况:节点值本身节点值+左子树节......
  • 51 nod 算法马拉松28 先序遍历与后序遍历
     ​​先序遍历与后序遍历​​ ​​​Scape​​​ (命题人)​​​tangjz​​​ (测试)基准时间限制:1 秒空间限制:131072 KB分值: 40对于给定......
  • leetcode563. 二叉树的坡度。
    563.二叉树的坡度 二叉树大部分题目都可以用递归解决。为了满足一般性,即使题目初试没有的情况,子问题有的,也要考虑。递归就考虑当前的情况就行了,不要再考虑上一层或......
  • leetcode814. 二叉树剪枝。如果想到使用递归还是很简单的
    814.二叉树剪枝有一点疑问,为什么不能先     if(!root->left&&!root->right&&root->val==0)returnnullptr;   ?classSolution{public:TreeNode......
  • 每日算法之二叉树中和为某一值的路径(一)
    JZ82二叉树中和为某一值的路径(一)代码packageesay.JZ82二叉树中和为某一值的路径1;importjava.util.*;classTreeNode{intval=0;TreeNodeleft=......
  • 二叉树
    01.二叉搜索树的最近公共祖先235.二叉搜索树的最近公共祖先当我们从上向下去递归遍历,第一次遇到cur节点是数值在[p,q]区间中,那么cur就是p和q的最近公共祖先;当前节......
  • LC[199] 二叉树的右视图
    [199]二叉树的右视图题目链接:https://leetcode.cn/problems/binary-tree-right-side-view/description/WA一开始的想法是遍历二叉树,只需要右分枝即可。但是如果右边没......
  • 【算法】Java解答有序链表转换二叉搜索树,从中序与后序遍历序列构造二叉树
    有序链表转换二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差......