热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php怎么看二叉树对称?

导读:今天编程笔记来给各位分享关于php怎么看二叉树对称的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、请高手发一下PHP版本二叉树按层遍历2、如何根据制定

导读:今天编程笔记来给各位分享关于php怎么看二叉树对称的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:


  • 1、请高手发一下PHP版本二叉树按层遍历


  • 2、如何根据制定的数据使用PHP生成一个二叉树


  • 3、急!帮忙用C++写一个判断二叉树是否对称的函数!


  • 4、二叉树的对称序列是什么


  • 5、PHP版本二叉树按层 从上到下左到右完全二叉树

请高手发一下PHP版本二叉树按层遍历

#二叉树的非递归遍历

3 class Node {

4 public $data;

5 public $left;

6 public $right;

7 }

8

9 #前序遍历,和深度遍历一样

10 function preorder($root) {

11 $stack = array();

12 array_push($stack, $root);

13 while (!empty($stack)) {

14 $cnode = array_pop($stack);

15 echo $cnode-data . " ";

16 if ($cnode-right != null) array_push($stack, $cnode-right);

17 if ($cnode-left != null) array_push($stack, $cnode-left);

18 }

19 }

如何根据制定的数据使用PHP生成一个二叉树

假如你所说的二叉树是指这种的话

那么你的数据结构一定要满足一个条件,则每一条数据必须记录好父级的标识

?php

$data = array(

    array(

        'id' = 1,

        'pid' = 0,

        'name' = ""新建脑图,

    ),

    array(

        'id' = 2,

        'pid' = 1,

        'name' = "分支主题",

    ),

    array(

        'id' = 3,

        'pid' = 1,

        'name' = "分支主题",

    ),

);

?

上述二位数组中的 id为2,3的子数组的父级(pid)id均是1,则他们的父级就是id为1的数组

?php

foreach($data as $key=$value){

    if( $value['pid'] == '0'){

        $parent[] = $value;

        unset($data[$key]);

    } 

}

foreach($parent as $key=$value){

    foreach($data as $k=$v){

        if( $v['pid'] == $value['id'] ){

            $parent[$key]['_child'][] = $v;

            unset($data[$k]);

        } 

    }

}

?

通过以上循环过后,对应二叉树关系的数组就可以做出来了

当然上述代码只能进行到二级二叉树,如果想做出无限级二叉树的数组,则必须使用到递归函数了

PS:上述代码是网页里手打的,没经过测试,但思路肯定是没问题的哈

急!帮忙用C++写一个判断二叉树是否对称的函数!

//判断一棵树是否对称

int SymmTree(BTNode *root)

{

if( root==NULL)//当树为空时

return 1;

else

return Like(root-left, root-right);

}

//判断左右子树是否相似

int Like(BTNode *p1, BTNode *p2)

{

if(p1==NULL p2==NULL)

return 1;

else if( p1==NULL || p2==NULL)

return 0;

else return Like(p1-left, p2-left)Like(p1-right, p2-right);

}

二叉树的对称序列是什么

就是中序,先访问左子树,后访问父节点,最后访问右子树。

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

遍历方案

二叉树遍历

二叉树遍历

从二叉树的 递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

⑴访问结点本身(N),

⑵遍历该结点的左子树(L),

⑶遍历该结点的右子树(R)。

以上三种操作有六种执行次序:

NLR、LNR、LRN、NRL、RNL、RLN。

注意:

前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。

遍历命名

根据访问结点操作发生位置命名:

① NLR: 前序遍历(Preorder Traversal 亦称(先序遍历))

——访问根结点的操作发生在遍历其左右子树之前。

② LNR: 中序遍历(Inorder Traversal)

——访问根结点的操作发生在遍历其左右子树之中(间)。

③ LRN: 后序遍历(Postorder Traversal)

——访问根结点的操作发生在遍历其左右子树之后。

注意:

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为 先根遍历、中根遍历和后根遍历。

遍历算法

1.先(根)序遍历的 递归算法定义:

若二叉树非空,则依次执行如下操作:

二叉树遍历

⑴ 访问根结点;

⑵ 遍历左子树;

⑶ 遍历右子树。

2.中(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵访问根结点;

⑶遍历右子树。

3.后(根)序遍历得递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵遍历右子树;

⑶访问根结点。

中序算法实现

用二叉链表做为存储结构,中序遍历算法可描述为:

void InOrder(BinTree T)

{ //算法里①~⑥是为了说明执行过程加入的标号

① if(T) { // 如果二叉树非空

② InOrder(T-lchild);

③ printf("%c",T-data); // 访问结点

④ InOrder(T-rchild);

⑤ }

⑥ } // InOrder

PHP版本二叉树按层 从上到下左到右完全二叉树

?php

/**  * 二叉树的定义  */

class BinaryTree {

protected $key = NULL;      //  当前节点的值

protected $left = NULL;     //  左子树

protected $right = NULL;    //  右子树

/**      * 以指定的值构造二叉树,并指定左右子树      *

* @param mixed $key 节点的值.

* @param mixed $left 左子树节点.

* @param mixed $right 右子树节点.

*/

public function __construct( $key = NULL, $left = NULL, $right = NULL) {

       $this-key = $key;

        if ($key === NULL) {

            $this-left = NULL;

            $this-right = NULL;

        }

        elseif ($left === NULL) {

            $this-left = new BinaryTree();

            $this-right = new BinaryTree();

        }

        else {

            $this-left = $left;

            $this-right = $right;

        }

    }

 

    /**

     * 析构方法.

     */

    public function __destruct() {

        $this-key = NULL;

        $this-left = NULL;

        $this-right = NULL;

    }

 

    /**

    * 清空二叉树.

    **/

    public function purge () {

        $this-key = NULL;

        $this-left = NULL;

        $this-right = NULL;

    }

 

    /**

     * 测试当前节点是否是叶节点.

     *

     * @return boolean 如果节点非空并且有两个空的子树时为真,否则为假.

     */

    public function isLeaf() {

        return !$this-isEmpty() 

            $this-left-isEmpty() 

            $this-right-isEmpty();

    }

 

    /**

     * 测试节点是否为空

     *

     * @return boolean 如果节点为空返回真,否则为假.

     */

    public function isEmpty() {

        return $this-key === NULL;

    }

 

    /**

     * Key getter.

     *

     * @return mixed 节点的值.

     */

    public function getKey() {

        if ($this-isEmpty()) {

            return false;

        }

        return $this-key;

    }

 

    /**

     * 给节点指定Key值,节点必须为空

     *

     * @param mixed $object 添加的Key值.

     */

    public function attachKey($obj) {

        if (!$this-isEmpty())

            return false;

        $this-key = $obj;

        $this-left = new BinaryTree();

        $this-right = new BinaryTree();

    }

 

    /**

     * 删除key值,使得节点为空.

     */

    public function detachKey() {

        if (!$this-isLeaf())

            return false;

        $result = $this-key;

        $this-key = NULL;

        $this-left = NULL;

        $this-right = NULL;

        return $result;

    }

 

    /**

     * 返回左子树

     *

     * @return object BinaryTree 当前节点的左子树.

     */

    public function getLeft() {

        if ($this-isEmpty())

            return false;

        return $this-left;

    }

 

    /**

     * 给当前结点添加左子树

     *

     * @param object BinaryTree $t 给当前节点添加的子树.

     */

    public function attachLeft(BinaryTree $t) {

        if ($this-isEmpty() || !$this-left-isEmpty())

            return false;

        $this-left = $t;

    }

 

    /**

     * 删除左子树

     *

     * @return object BinaryTree  返回删除的左子树.

     */

    public function detachLeft() {

        if ($this-isEmpty())

            return false;

        $result = $this-left;

        $this-left = new BinaryTree();

        return $result;

    }

 

    /**

     * 返回当前节点的右子树

     *

     * @return object BinaryTree 当前节点的右子树.

     */

    public function getRight() {

        if ($this-isEmpty())

            return false;

        return $this-right;

    }

 

    /**

     * 给当前节点添加右子树

     *

     * @param object BinaryTree $t 需要添加的右子树.

     */

    public function attachRight(BinaryTree $t) {

        if ($this-isEmpty() || !$this-right-isEmpty())

            return false;

        $this-right = $t;

    }

 

    /**

     * 删除右子树,并返回此右子树

     * @return object BinaryTree 删除的右子树.

     */

    public function detachRight() {

        if ($this-isEmpty ())

            return false;

        $result = $this-right;

        $this-right = new BinaryTree();

        return $result;

    }

 

    /**

     * 先序遍历

     */

    public function preorderTraversal() {

        if ($this-isEmpty()) {

            return ;

        }

        echo ' ', $this-getKey();

        $this-getLeft()-preorderTraversal();

        $this-getRight()-preorderTraversal();

    }

 

    /**

     * 中序遍历

     */

    public function inorderTraversal() {

        if ($this-isEmpty()) {

            return ;

        }

        $this-getLeft()-preorderTraversal();

        echo ' ', $this-getKey();

        $this-getRight()-preorderTraversal();

    }

 

    /**

     * 后序遍历

     */

    public function postorderTraversal() {

        if ($this-isEmpty()) {

            return ;

        }

        $this-getLeft()-preorderTraversal();

        $this-getRight()-preorderTraversal();

        echo ' ', $this-getKey();

    }

}

 

/**

 * 二叉排序树的PHP实现

 */

 

class BST extends BinaryTree {

  /**

     * 构造空的二叉排序树

     */

    public function __construct() {

        parent::__construct(NULL, NULL, NULL);

    }

 

    /**

     * 析构

     */

    public function __destruct() {

        parent::__destruct();

    }

 

    /**

     * 测试二叉排序树中是否包含参数所指定的值

     *

     * @param mixed $obj 查找的值.

     * @return boolean True 如果存在于二叉排序树中则返回真,否则为假期

     */

    public function contains($obj) {

        if ($this-isEmpty())

            return false;

        $diff = $this-compare($obj);

        if ($diff == 0) {

            return true;

        }elseif ($diff  0)             return $this-getLeft()-contains($obj);

        else

            return $this-getRight()-contains($obj);

    }

 

    /**

     * 查找二叉排序树中参数所指定的值的位置

     *

     * @param mixed $obj 查找的值.

     * @return boolean True 如果存在则返回包含此值的对象,否则为NULL

     */

    public function find($obj) {

        if ($this-isEmpty())

            return NULL;

        $diff = $this-compare($obj);

        if ($diff == 0)

            return $this-getKey();

        elseif ($diff  0)             return $this-getLeft()-find($obj);

        else

            return $this-getRight()-find($obj);

    }

 

    /**

     * 返回二叉排序树中的最小值

     * @return mixed 如果存在则返回最小值,否则返回NULL

     */

    public function findMin() {

        if ($this-isEmpty ())

            return NULL;

        elseif ($this-getLeft()-isEmpty())

            return $this-getKey();

        else

            return $this-getLeft()-findMin();

    }

 

    /**

     * 返回二叉排序树中的最大值

     * @return mixed 如果存在则返回最大值,否则返回NULL

     */

    public function findMax() {

        if ($this-isEmpty ())

            return NULL;

        elseif ($this-getRight()-isEmpty())

            return $this-getKey();

        else

            return $this-getRight()-findMax();

    }

 

    /**

     * 给二叉排序树插入指定值

     *

     * @param mixed $obj 需要插入的值.

     * 如果指定的值在树中存在,则返回错误

     */

    public function insert($obj) {

        if ($this-isEmpty()) {

            $this-attachKey($obj);

        } else {

            $diff = $this-compare($obj);

            if ($diff == 0)

                die('argu error');

            if ($diff  0)                 $this-getLeft()-insert($obj);

            else

                $this-getRight()-insert($obj);

        }

        $this-balance();

    }

 

 /**

     * 从二叉排序树中删除指定的值

     *

     * @param mixed $obj 需要删除的值.

     */

    public function delete($obj) {

        if ($this-isEmpty ())

            die();

 

        $diff = $this-compare($obj);

        if ($diff == 0) {

            if (!$this-getLeft()-isEmpty()) {

                $max = $this-getLeft()-findMax();

                $this-key = $max;

                $this-getLeft()-delete($max);

            }

            elseif (!$this-getRight()-isEmpty()) {

                $min = $this-getRight()-findMin();

                $this-key = $min;

                $this-getRight()-delete($min);

            } else

                $this-detachKey();

        } else if ($diff  0)                 $this-getLeft()-delete($obj);

            else

                $this-getRight()-delete($obj);

        $this-balance();

    }

 

    public function compare($obj) {

        return $obj - $this-getKey();

    }

 

    /**

     * Attaches the specified object as the key of this node.

     * The node must be initially empty.

     *

     * @param object IObject $obj The key to attach.

     * @exception IllegalOperationException If this node is not empty.

     */

    public function attachKey($obj) {

        if (!$this-isEmpty())

            return false;

        $this-key = $obj;

        $this-left = new BST();

        $this-right = new BST();

    }

 

    /**

     * Balances this node.

     * Does nothing in this class.

     */

    protected function balance () {}

 

    /**

     * Main program.

     *

     * @param array $args Command-line arguments.

     * @return integer Zero on success; non-zero on failure.

     */

    public static function main($args) {

        printf("BinarySearchTree main program.\n");

        $root = new BST();

        foreach ($args as $row) {

            $root-insert($row);

        }

        return $root;

    }

}

 

$root = BST::main(array(50, 3, 10, 5, 100, 56, 78));

echo $root-findMax();

$root-delete(100);

echo $root-findMax();

结语:以上就是编程笔记为大家介绍的关于php怎么看二叉树对称的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。


推荐阅读
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Java编程实现邻接矩阵表示稠密图的方法及实现类介绍
    本文介绍了Java编程如何实现邻接矩阵表示稠密图的方法,通过一个名为AMWGraph.java的类来构造邻接矩阵表示的图,并提供了插入结点、插入边、获取邻接结点等功能。通过使用二维数组来表示结点之间的关系,并通过元素的值来表示权值的大小,实现了稠密图的表示和操作。对于对稠密图的表示和操作感兴趣的读者可以参考本文。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
双鱼獒主
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有