php 二叉樹遍歷

二叉樹是邏輯結構,二叉鏈表是二叉樹的物理實現,是它的一種存儲結構。二者之間的關係屬於概念和實現,抽象和具體的關係。php

 

  • 前序遍歷:根節點->左子樹->右子樹
  • 中序遍歷:左子樹->根節點->右子樹
  • 後序遍歷:左子樹->右子樹->根節點

深度優先遍歷:

    前序遍歷:10 8 7 9 12 11 13
    中序遍歷:7 8 9 10 11 12 13
    後序遍歷:7 9 8 11 13 12 10

廣度優先遍歷:

    層次遍歷:10 8 12 7 9 11 13

二叉樹的深度優先遍歷的非遞歸的通用作法是採用棧,廣度優先遍歷的非遞歸的通用作法是採用隊列。

html

<?php
/********************************************************
 * 我寫的PHP都是從C語言的數據結構中演化而來************************
 **************************************************************
 * /**
 *    ******二叉樹圖****
 *      A                    *
 *     * *                   *
 *    *   *                  *
 *   B     C                *
 *        *                   *
 *       *                    *
 *      D                    *
 *       *                    *
 *         *E                *
 ******************
 * PHP- 鏈式二叉樹的遍歷---先序遍歷(根,左,右)-中序遍歷(左,根,右)-後序遍歷(左,右,根)
 * 先 A B C D E
 * 中 B A D E C
 * 後 B E D C A
 * @time
 * @Author
 ****/
Class  BTreeNode
{
    public $data; //數據域
    public $LeftHand = NULL; //左指針
    public $RightHand = NULL; //右指針

    public function __construct ($data)
    {
        if (!empty($data)) {
            $this->data = $data;
        }
    }

    //先序遍歷(根,左,右)遞歸實現
    public function PreTraverseBTree ($BTree)
    {
        if (NULL !== $BTree) {
            var_dump($BTree->data);//根
            if (NULL !== $BTree->LeftHand) {
                $this->PreTraverseBTree($BTree->LeftHand); //遞歸遍歷左樹
            }
            if (NULL !== $BTree->RightHand) {
                $this->PreTraverseBTree($BTree->RightHand); //遞歸遍歷右樹
            }
        }
    }

    //中序遍歷(左,根,右)遞歸實現
    public function InTraverseBTree ($BTree)
    {
        if (NULL !== $BTree) {
            if (NULL !== $BTree->LeftHand) {
                $this->InTraverseBTree($BTree->LeftHand); //遞歸遍歷左樹
            }
            var_dump($BTree->data); //根
            if (NULL !== $BTree->RightHand) {
                $this->InTraverseBTree($BTree->RightHand); //遞歸遍歷右樹
            }
        }
    }

    //後序遍歷(左,右,根)遞歸實現
    public function FexTraverseBTree ($BTree)
    {
        if (NULL !== $BTree) {
            if (NULL !== $BTree->LeftHand) {
                $this->FexTraverseBTree($BTree->LeftHand); //遞歸遍歷左樹
            }
            if (NULL !== $BTree->RightHand) {
                $this->FexTraverseBTree($BTree->RightHand); //遞歸遍歷右樹
            }
            var_dump($BTree->data); //根
        }
    }
}

header("Content-Type:text/html;charset=utf-8");
echo '先的內存爲' . var_dump(memory_get_usage());
echo '<hr/>';
//建立五個節點
$A = new  BTreeNode('A');
$B = new  BTreeNode('B');
$C = new  BTreeNode('C');
$D = new  BTreeNode('D');
$E = new  BTreeNode('E');
//鏈接造成一個二叉樹
$A->LeftHand = $B;
$A->RightHand = $C;
$C->LeftHand = $D;
$D->RightHand = $E;

//先序遍歷
echo '先序遍歷的結果' . '<br>';
$A->PreTraverseBTree($A);
echo '<br/>中序遍歷的結果' . '<br>';
$A->InTraverseBTree($A);
echo '<br/>後序列遍歷的結果' . '<br/>';
$A->FexTraverseBTree($A);
echo '<hr/>';
echo '後的內存爲' . var_dump(memory_get_usage());
相關文章
相關標籤/搜索