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
二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。
<?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());