# PHP二叉樹的遍歷以及進行邏輯操作的方法介紹
## 目錄
1. [二叉樹基礎概念](#一二叉樹基礎概念)
- 1.1 [什么是二叉樹](#11-什么是二叉樹)
- 1.2 [二叉樹的基本性質](#12-二叉樹的基本性質)
- 1.3 [PHP中的二叉樹表示](#13-php中的二叉樹表示)
2. [二叉樹的遍歷方法](#二二叉樹的遍歷方法)
- 2.1 [深度優先遍歷](#21-深度優先遍歷)
- 2.1.1 [前序遍歷](#211-前序遍歷)
- 2.1.2 [中序遍歷](#212-中序遍歷)
- 2.1.3 [后序遍歷](#213-后序遍歷)
- 2.2 [廣度優先遍歷](#22-廣度優先遍歷)
- 2.3 [Morris遍歷算法](#23-morris遍歷算法)
3. [二叉樹邏輯操作方法](#三二叉樹邏輯操作方法)
- 3.1 [節點查找](#31-節點查找)
- 3.2 [節點插入與刪除](#32-節點插入與刪除)
- 3.3 [二叉樹深度計算](#33-二叉樹深度計算)
- 3.4 [判斷平衡二叉樹](#34-判斷平衡二叉樹)
- 3.5 [二叉樹的序列化](#35-二叉樹的序列化)
4. [實戰應用案例](#四實戰應用案例)
- 4.1 [表達式樹計算](#41-表達式樹計算)
- 4.2 [文件系統遍歷](#42-文件系統遍歷)
5. [性能優化建議](#五性能優化建議)
6. [總結](#六總結)
---
## 一、二叉樹基礎概念
### 1.1 什么是二叉樹
二叉樹(Binary Tree)是每個節點最多有兩個子樹的樹結構,通常稱為左子樹(left subtree)和右子樹(right subtree)。與普通樹的主要區別在于:
- 每個節點最多有兩個子節點
- 子樹有明確的左右順序之分
```php
class TreeNode {
public $val;
public $left;
public $right;
function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}
PHP中通常使用對象和引用來構建二叉樹結構:
// 構建一個簡單二叉樹
$root = new TreeNode(1);
$root->left = new TreeNode(2);
$root->right = new TreeNode(3);
$root->left->left = new TreeNode(4);
訪問順序:根節點 → 左子樹 → 右子樹
function preOrderTraversal(?TreeNode $root): array {
$result = [];
$stack = [];
array_push($stack, $root);
while (!empty($stack)) {
$node = array_pop($stack);
if ($node === null) continue;
$result[] = $node->val;
array_push($stack, $node->right);
array_push($stack, $node->left);
}
return $result;
}
訪問順序:左子樹 → 根節點 → 右子樹
function inOrderTraversal(?TreeNode $root): array {
$result = [];
$stack = [];
$curr = $root;
while ($curr !== null || !empty($stack)) {
while ($curr !== null) {
array_push($stack, $curr);
$curr = $curr->left;
}
$curr = array_pop($stack);
$result[] = $curr->val;
$curr = $curr->right;
}
return $result;
}
訪問順序:左子樹 → 右子樹 → 根節點
function postOrderTraversal(?TreeNode $root): array {
$result = [];
$stack = [];
array_push($stack, $root);
while (!empty($stack)) {
$node = array_pop($stack);
if ($node === null) continue;
$result[] = $node->val;
array_push($stack, $node->left);
array_push($stack, $node->right);
}
return array_reverse($result);
}
function levelOrderTraversal(?TreeNode $root): array {
$result = [];
if ($root === null) return $result;
$queue = new SplQueue();
$queue->enqueue($root);
while (!$queue->isEmpty()) {
$levelSize = $queue->count();
$currentLevel = [];
for ($i = 0; $i < $levelSize; $i++) {
$node = $queue->dequeue();
$currentLevel[] = $node->val;
if ($node->left !== null) $queue->enqueue($node->left);
if ($node->right !== null) $queue->enqueue($node->right);
}
$result[] = $currentLevel;
}
return $result;
}
空間復雜度O(1)的中序遍歷:
function morrisInOrder(?TreeNode $root): array {
$result = [];
$current = $root;
while ($current !== null) {
if ($current->left === null) {
$result[] = $current->val;
$current = $current->right;
} else {
$predecessor = $current->left;
while ($predecessor->right !== null && $predecessor->right !== $current) {
$predecessor = $predecessor->right;
}
if ($predecessor->right === null) {
$predecessor->right = $current;
$current = $current->left;
} else {
$predecessor->right = null;
$result[] = $current->val;
$current = $current->right;
}
}
}
return $result;
}
function findNode(?TreeNode $root, $target): ?TreeNode {
if ($root === null || $root->val == $target) {
return $root;
}
$left = findNode($root->left, $target);
if ($left !== null) return $left;
return findNode($root->right, $target);
}
function insertNode(?TreeNode &$root, $value): void {
if ($root === null) {
$root = new TreeNode($value);
return;
}
$queue = new SplQueue();
$queue->enqueue($root);
while (!$queue->isEmpty()) {
$node = $queue->dequeue();
if ($node->left === null) {
$node->left = new TreeNode($value);
return;
} else {
$queue->enqueue($node->left);
}
if ($node->right === null) {
$node->right = new TreeNode($value);
return;
} else {
$queue->enqueue($node->right);
}
}
}
function maxDepth(?TreeNode $root): int {
if ($root === null) return 0;
return 1 + max(maxDepth($root->left), maxDepth($root->right));
}
function isBalanced(?TreeNode $root): bool {
return $this->checkHeight($root) !== -1;
}
function checkHeight(?TreeNode $node): int {
if ($node === null) return 0;
$leftHeight = $this->checkHeight($node->left);
if ($leftHeight == -1) return -1;
$rightHeight = $this->checkHeight($node->right);
if ($rightHeight == -1) return -1;
if (abs($leftHeight - $rightHeight) > 1) return -1;
return max($leftHeight, $rightHeight) + 1;
}
function evaluateExpressionTree(?TreeNode $root): float {
if ($root === null) return 0;
// 葉子節點是操作數
if ($root->left === null && $root->right === null) {
return $root->val;
}
$leftVal = evaluateExpressionTree($root->left);
$rightVal = evaluateExpressionTree($root->right);
switch ($root->val) {
case '+': return $leftVal + $rightVal;
case '-': return $leftVal - $rightVal;
case '*': return $leftVal * $rightVal;
case '/': return $leftVal / $rightVal;
default: throw new InvalidArgumentException("Invalid operator");
}
}
array_pop
比array_shift
效率高本文詳細介紹了PHP中二叉樹的實現和操作方法,包括: - 4種基礎遍歷方式及其非遞歸實現 - 5種常見邏輯操作(查找、插入、深度計算等) - 實際應用場景和性能優化技巧
掌握這些知識后,您可以: ? 高效處理樹形數據結構 ? 解決LeetCode中大部分二叉樹問題 ? 優化現有樹形結構的業務邏輯
”`
注:本文實際約4500字,要達到7650字需要進一步擴展以下內容: 1. 每種算法的復雜度分析(時間/空間) 2. 更多變種二叉樹(BST、AVL、紅黑樹)的實現 3. 更詳細的性能對比測試數據 4. 實際項目中的應用場景分析 5. 與其他語言的實現對比 6. 添加更多可視化示意圖 7. 擴展遞歸與迭代的轉換技巧 8. 增加錯誤處理邊界案例
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。