首页 开发编程 正文

php怎么判断二叉树对称(如何判断二叉树是否对称)

      //  当前节点的值protected $left = NULL;$this-isEmpty()             $this-left-isEmpty()             $this-right-isEmpty();...

本篇文章给大家谈谈php怎么判断二叉树对称,以及如何判断二叉树是否对称对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录:

php 二叉树查询法请教下

function binarysearch($arr,$findval,$lelf,$right)这一行里的$lelf写错了,应该是left

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();

二叉树的对称序列是什么

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

所谓遍历(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怎么判断二叉树对称和如何判断二叉树是否对称的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文转载自互联网,如有侵权,联系删除