首页 开发编程 正文

php字形怎么打印二叉树(二叉树z字打印)

while(true){while(lpCurNode){if(lpfun;stack.Push(lpCurNode);有再进PUSH}lpCurNode=lpCurNode-m_lpRight;typefunlpfun){MyStackTreeNode*stack:while(true){while(lpCurNode){stack...

本篇文章给大家谈谈php字形怎么打印二叉树,以及二叉树z字打印对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录:

如何打印二叉树

这个先容易的,用递归法就行了。

void MyTree::PrePrintf(TreeNode * lpCurNode,typefun lpfun)

{

MyStackTreeNode * stack;

while(true)

{

while (lpCurNode)

{

if (lpfun!=NULL)

{

(this-*lpfun)(lpCurNode);

stack.Push(lpCurNode);

}

lpCurNode=lpCurNode-m_lpLeft;

}

if (!stack.Pop(lpCurNode))

{

break;

}

lpCurNode=lpCurNode-m_lpRight;

}

}

void MyTree::MidPrintf(TreeNode * lpCurNode,typefun lpfun)

{

MyStackTreeNode * stack;

while (true)

{

while(lpCurNode)

{

stack.Push(lpCurNode);

lpCurNode=lpCurNode-m_lpLeft;

}

if (!stack.Pop(lpCurNode)) //出PUSH

{

break;

}

if (lpfun!=NULL)

{

(this-*lpfun)(lpCurNode); //输出然后再if右边有没有值,有再进PUSH

}

lpCurNode=lpCurNode-m_lpRight;

}

}

void MyTree::AftPrintf(TreeNode * lpCurNode,typefun lpfun)

{

MyStackTreeNode * stack;

TreeNode* lpFang=NULL;

while(true)

{

while(lpCurNode)

{

stack.Push(lpCurNode);

lpCurNode=lpCurNode-m_lpLeft;

}

if (!stack.Pop(lpCurNode))

{

break;

}

if (lpCurNode-m_lpRight==NULL||lpCurNode-m_lpRight==lpFang)

{

lpFang=lpCurNode;

if (lpfun!=NULL)

{

(this-*lpfun)(lpCurNode);

}

lpCurNode=NULL;

continue;

}

else

stack.Push(lpCurNode);

lpCurNode=lpCurNode-m_lpRight;

}

}

如何根据制定的数据使用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:上述代码是网页里手打的,没经过测试,但思路肯定是没问题的哈

如何将二叉树的节点分层打印出来

你指的是层序打印吗?

二叉树的节点层序打印要使用“队列”

代码为:

void Order(BinTreeNode *root) //BinTreeNode是二叉树结点,root为二叉树的根结点

{

QueueBinTreeNode* Q; //定义一个二叉树结点指针类型的队列

BinTreeNode *p=root; //将根结点传给一个P指针

Q.EnQueue(p); //根结点入队

while(!Q.IsEmpty()) //当队列不空的时候,执行下列操作,队列不空说明还没遍历完

{

Q.DeQueue(p); visit(p); //P出队,并访问P

if(p-leftchild!=NULL) Q.EnQueue(p-leftchild); //如果P的左孩子不空,左孩子入队

if(p-rightchild!=NULL) Q.EnQueue(p-rightchild); //如果P的右孩子不空,右孩子入队

}

}

这段代码的整个逻辑要仔细想想清楚哦~

还有,如果是层序打印,楼上的说法,递归是无法做到的。

这是将树分层打印的代码,正确无误!

void LevelOrder(BinTreeNode *tree)

{

QueueBinTreeNode * Q1,Q2;

BinTreeNode *p=tree;

Q1.EnQueue(p);

while(!(Q1.IsEmpty() Q2.IsEmpty()))

{

while(!Q1.IsEmpty())

{

Q1.DeQueue(p);

coutp-data" ";

if(p-leftchild!=NULL) Q2.EnQueue(p-leftchild);

if(p-rightchild!=NULL) Q2.EnQueue(p-rightchild);

}

coutendl;

while(!Q2.IsEmpty())

{

Q2.GetQueue(p); //这是队列的一个方法,让P指向队首元素

Q2.DeQueue(p);

coutp-data" ";

if(p-leftchild!=NULL) Q1.EnQueue(p-leftchild);

if(p-rightchild!=NULL) Q1.EnQueue(p-rightchild);

}

coutendl;

}

}

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字形怎么打印二叉树和二叉树z字打印的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

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