首页 > 编程语言 >对二叉树深度优先遍历php算法实现的改进(先序遍历,中序遍历,后序遍历)

对二叉树深度优先遍历php算法实现的改进(先序遍历,中序遍历,后序遍历)

时间:2024-04-02 11:01:43浏览次数:23  
标签:遍历 中序 tree value Element right 二叉树 left

    树是一种数据结构,二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。以某种特定顺序访问树中所有的节点称为树的遍历,今天在查看了这遍文章:https://www.cnblogs.com/ivy-zheng/p/10995492.html 中对树的遍历的实现之后我对其PHP遍历算法代码进行了重构,这次只是深度优先遍历。

     所谓深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。可以细分为先序遍历、中序遍历、后序遍历。

    从那里截个比较好的图来如下:

    看了一下文章中的实现代码,觉得可以进行改进,于是动手使用PHP写了一下遍历程序。将三种遍历方法写在一起,同时对树的构建过程进行了优化整合,如下是我在word里面画的一个二叉树的结构图,而且是一个满二叉树,如下:

写的PHP遍历程序如下:

<?php
#author:04007.cn
#note:二叉树的遍历

class Element{
    public $value;
    public $left;
    public $right;
    
    public function __construct($value, $left=null, $right=null){
        $attributes = get_class_vars(Element);
        foreach($attributes as $key=>$val){
            ${$key} != null && $this->{$key} = ${$key};
        }   
    }   
}

$val60 = new Element(60);
$val75 = new Element(75);
$val90 = new Element(90);
$val99 = new Element(99);
$val65 = new Element(65, $val60, $val75);
$val95 = new Element(95, $val90, $val99);
$val88 = new Element(88, $val65, $val95);

print_r($val88); 

#对树进行先序遍历、中序遍历、后序遍历
function readTree($tree, $type='first'){
    if(!$tree || $tree->value==null){
        return;
    }else{
        switch($type){
            #中序遍历
            case 'middle':
                $tree->left != null && readTree($tree->left, $type);
                echo $tree->value,',';
                $tree->right != null && readTree($tree->right, $type);
                break;
            #后序遍历
            case 'last':
                readTree($tree->left, $type);
                readTree($tree->right, $type);
                echo $tree->value,',';
                break;
            #默认先序遍历
            default: 
                echo $tree->value,',';
                readTree($tree->left, $type);
                readTree($tree->right, $type);
                break;
        }   
    }   
}
echo '先序遍历:';readTree($val88);echo "\n";
echo '中序遍历:';readTree($val88,'middle');echo "\n";
echo '后序遍历:';readTree($val88,'last');echo "\n";

下面是在服务器上运行的结果:

[root@04007 php]# php tree.php 
Element Object
(
    [value] => 88
    [left] => Element Object
        (
            [value] => 65
            [left] => Element Object
                (
                    [value] => 60
                    [left] => 
                    [right] => 
                )

            [right] => Element Object
                (
                    [value] => 75
                    [left] => 
                    [right] => 
                )

        )

    [right] => Element Object
        (
            [value] => 95
            [left] => Element Object
                (
                    [value] => 90
                    [left] => 
                    [right] => 
                )

            [right] => Element Object
                (
                    [value] => 99
                    [left] => 
                    [right] => 
                )

        )

)
先序遍历:88,65,60,75,95,90,99,
中序遍历:60,65,75,88,90,95,99,
后序遍历:60,75,65,90,99,95,88,

标签:遍历,中序,tree,value,Element,right,二叉树,left
From: https://blog.csdn.net/weixin_47792780/article/details/137216164

相关文章

  • 二叉树结点关键字输出的递归算法实现
    在计算机科学中,二叉树是一种重要的数据结构,广泛应用于各种算法和程序设计中。二叉树的遍历是二叉树操作中的基础问题之一,其目的是以某种规则访问二叉树的每个结点,使得每个结点被且仅被访问一次。给定一个具有n个结点的二叉树,我们需要编写一个递归过程,以O(n)的时间复杂度输出......
  • 基于栈结构的非递归二叉树结点关键字输出算法
    基于栈结构的非递归二叉树结点关键字输出算法一、引言二、二叉树基本概念三、非递归遍历算法基础四、算法设计五、算法实现六、C代码示例七、算法分析八、优化与讨论一、引言在计算机科学中,二叉树是一种重要的数据结构,它广泛应用于各种算法和数据结构中。对于二叉树......
  • 894. 所有可能的真二叉树(中等)
    没做出来,难受......
  • 详解数仓对象设计中序列SEQUENCE原理与应用
    本文分享自华为云社区《GaussDB(DWS)对象设计之序列SEQUENCE原理与使用方法介绍》,作者:VV一笑。1.前言适用版本:8.2.1及以上版本序列SEQUENCE用来生成唯一整数的数据库对象,本文对序列SEQUENCE的使用场景、使用方法及相关函数进行了介绍,并针对序列SEQUENCE在使用中容易遇到的问......
  • 线索二叉树
    //中序遍历对二叉树线索化的递归算法voidInThread(ThreadTree&p,ThreadTree&pre){ if(p!=NULL){ InThread(p->lchild,pre); //一直递归到最左子树/*中序遍历*/if(p->lchild==NULL){ //没有左孩子就指向前驱 p->l......
  • 2024.2.13力扣每日一题——二叉树的垂序遍历
    2024.2.13题目来源我的题解方法一TreeMap+深度优先遍历方法二官方题解(自定义排序)数组实现欢迎讨论(做题中遇到的一个问题)题目来源力扣每日一题;题序:987我的题解方法一TreeMap+深度优先遍历在递归形式的前、中、后序遍历中任选一种进行遍历,并在遍历过程中记......
  • 2024.2.16力扣每日一题——二叉树的锯齿形层序遍历
    2024.2.16题目来源我的题解方法一双端队列+标志题目来源力扣每日一题;题序:103我的题解方法一双端队列+标志层序遍历利用双端队列和标志,判断当前应该往那个方向遍历注意:在逆向遍历时,加入后续节点到队列中的顺序需要改变时间复杂度:O(N),其中N为二叉树的......
  • 序列化二叉树
    请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。数据范围树中节点数量 [0,1000]。样例你可以序列化如下的二叉树8/\122/\64为:"[8,12,2,null,null,6,......
  • 【二叉树】Leetcode 437. 路径总和 III【中等】
    路径总和III给定一个二叉树的根节点root,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例1:**输入:**root=[10,5,-3,3,2,null,11,3,......
  • 2673. 使二叉树所有路径值相等的最小代价
    思路先看3节点的子树,想要路径值相同,只能修改叶子节点的值,如上图只能2去+1操作。核心思想:那么对于任意左右孩子节点,想要从根节点下来的路径相同,只能修改孩子节点。所以我们只需要从下至上记录叶子节点到当前节点的路径值,然后计算当前节点和右节点的差值。详细看灵神树上贪心......