当前位置: 面试刷题>> 完全二叉树 (经典算法题500道)
### 题目描述补充
**题目**: 编写一个算法,用于实现一个完全二叉树的构建、遍历以及层级遍历(或称为广度优先遍历)。完全二叉树是一种特殊的二叉树,其中除了最后一层外,每一层都被完全填满,并且所有节点都尽可能地向左对齐。
**要求**:
1. **构建完全二叉树**:给定一个有序数组(通常是升序或降序),根据数组的值构建一棵完全二叉树。
2. **遍历完全二叉树**:
- 实现前序遍历(根节点 -> 左子树 -> 右子树)。
- 实现中序遍历(左子树 -> 根节点 -> 右子树,但在此上下文中可能不常用,因为完全二叉树不保证有序性)。
- 实现后序遍历(左子树 -> 右子树 -> 根节点)。
3. **层级遍历**:从根节点开始,按从上到下、从左到右的顺序访问所有节点。
### 示例代码
#### PHP 示例
```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;
}
}
function buildCompleteBinaryTree($arr) {
if (empty($arr)) return null;
return buildTreeHelper($arr, 0);
}
function buildTreeHelper($arr, $index) {
if ($index >= count($arr)) return null;
$node = new TreeNode($arr[$index]);
$node->left = buildTreeHelper($arr, 2 * $index + 1);
$node->right = buildTreeHelper($arr, 2 * $index + 2);
return $node;
}
function levelOrderTraversal($root) {
if ($root === null) return [];
$queue = new SplQueue();
$queue->enqueue($root);
$result = [];
while (!$queue->isEmpty()) {
$node = $queue->dequeue();
$result[] = $node->val;
if ($node->left) $queue->enqueue($node->left);
if ($node->right) $queue->enqueue($node->right);
}
return $result;
}
// 使用示例
$arr = [1, 2, 3, 4, 5, 6];
$root = buildCompleteBinaryTree($arr);
$levelOrder = levelOrderTraversal($root);
print_r($levelOrder);
```
#### Python 示例
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def buildCompleteBinaryTree(arr):
def build(index):
if index >= len(arr):
return None
node = TreeNode(arr[index])
node.left = build(2 * index + 1)
node.right = build(2 * index + 2)
return node
return build(0)
def levelOrderTraversal(root):
if not root:
return []
queue, result = [root], []
while queue:
node = queue.pop(0)
result.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return result
# 使用示例
arr = [1, 2, 3, 4, 5, 6]
root = buildCompleteBinaryTree(arr)
level_order = levelOrderTraversal(root)
print(level_order)
```
#### JavaScript 示例
```javascript
class TreeNode {
constructor(val = 0, left = null, right = null) {
this.val = val;
this.left = left;
this.right = right;
}
}
function buildCompleteBinaryTree(arr) {
function build(index) {
if (index >= arr.length) return null;
const node = new TreeNode(arr[index]);
node.left = build(2 * index + 1);
node.right = build(2 * index + 2);
return node;
}
return build(0);
}
function levelOrderTraversal(root) {
if (!root) return [];
const queue = [root];
const result = [];
while (queue.length > 0) {
const node = queue.shift();
result.push(node.val);
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
return result;
}
// 使用示例
const arr = [1, 2, 3, 4, 5, 6];
const root = buildCompleteBinaryTree(arr);
const levelOrder = levelOrderTraversal(root);
console.log(levelOrder);
```
**码小课网站中有更多相关内容分享给大家学习**,涵盖各种算法和数据结构的知识,帮助大家更好地掌握编程技能。