二叉树
提示
- 二叉树定义:二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常被称为左子节点和右子节点。
- 二叉树类型:二叉树有多种类型,包括完全二叉树、完美二叉树、完全二叉树、退化树、偏斜二叉树和平衡二叉树,每种类型具有独特的特征和应用。
- 二叉树应用:二叉树广泛应用于数据快速访问、路由算法、堆数据结构和构建语法树等领域。
二叉树是一种树形数据结构,其中每个父节点最多有两个子节点。一个二叉树的节点由三部分组成:
-
数据项
-
左子节点的地址
-
右子节点的地址
二叉树的类型
1. 完全二叉树
完全二叉树是二叉树的一种特殊形式,其中每个父节点/内部节点要么有两个子节点,要么没有子节点。
要了解更多,请访问完全二叉树。
2. 完美二叉树
完美二叉树是一种二叉树,其中每个内部节点都恰好有两个子节点,并且所有叶节点都在同一层级。
要了解更多,请访问完美二叉树。
3. 完全二叉树
完全二叉树就像完全二叉树一样,但有两个主要区别:
- 每个层级必须被完全填满
- 所有叶元素必须倾向于左侧
- 最后一个叶元素可能没有右侧兄弟节点,即完全二叉树不必是完全二叉树
要了解更多,请访问完全二叉树。
4. 退化树或病态树
退化树或病态树是只有一个左或右子节点的树。
5. 偏斜二叉树
偏斜二叉树是一种病态/退化树,其中树要么由左节点要么由右节点主导。因此,有两种类型的偏斜二叉树:左偏斜二叉树和右偏斜二叉树。
6. 平衡二叉树
平衡二叉树是一种二叉树,在这种树中,每个节点的左右子树的高度差要么是 0 要么是 1。
要了解更多,请访问平衡二叉树。
二叉树的表示
二叉树的一个节点由一个结构体表示,包含一个数据部分和两个指向同类型其他结构体的指针。
struct node
{
int data;
struct node *left;
struct node *right;
};
Python、Java 和 C/C++ 示例
# Python 中的二叉树
class Node:
def __init__(self, key):
self.left = None
self.right = None
self.val = key
# 先序遍历
def traversePreOrder(self):
print(self.val, end=' ')
if self.left:
self.left.traversePreOrder()
if self.right:
self.right.traversePreOrder()
# 中序遍历
def traverseInOrder(self):
if self.left:
self.left.traverseInOrder()
print(self.val, end=' ')
if
self.right:
self.right.traverseInOrder()
# 后序遍历
def traversePostOrder(self):
if self.left:
self.left.traversePostOrder()
if self.right:
self.right.traversePostOrder()
print(self.val, end=' ')
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
print("先序遍历: ", end="")
root.traversePreOrder()
print("\n中序遍历: ", end="")
root.traverseInOrder()
print("\n后序遍历: ", end="")
root.traversePostOrder()
// Java 中的二叉树
// 节点创建
class Node {
int key;
Node left, right;
public Node(int item) {
key = item;
left = right = null;
}
}
class BinaryTree {
Node root;
BinaryTree(int key) {
root = new Node(key);
}
BinaryTree() {
root = null;
}
// 中序遍历
public void traverseInOrder(Node node) {
if (node != null) {
traverseInOrder(node.left);
System.out.print(" " + node.key);
traverseInOrder(node.right);
}
}
// 后序遍历
public void traversePostOrder(Node node) {
if (node != null) {
traversePostOrder(node.left);
traversePostOrder(node.right);
System.out.print(" " + node.key);
}
}
// 先序遍历
public void traversePreOrder(Node node) {
if (node != null) {
System.out.print(" " + node.key);
traversePreOrder(node.left);
traversePreOrder(node.right);
}
}
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
System.out.print("先序遍历:");
tree.traversePreOrder(tree.root);
System.out.print("\n中序遍历:");
tree.traverseInOrder(tree.root);
System.out.print("\n后序遍历:");
tree.traversePostOrder(tree.root);
}
}
// C 中的树遍历
#include <stdio.h>
#include <stdlib.h>
struct node {
int item;
struct node* left;
struct node* right;
};
// 中序遍历
void inorderTraversal(struct node* root) {
if (root == NULL) return;
inorderTraversal(root->left);
printf("%d ->", root->item);
inorderTraversal(root->right);
}
// 先序遍历
void preorderTraversal(struct node* root) {
if (root == NULL) return;
printf("%d ->", root->item);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 后序遍历
void postorderTraversal(struct node* root) {
if (root == NULL) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ->", root->item);
}
// 创建新节点
struct node* createNode(value) {
struct node* newNode = malloc(sizeof(struct node));
newNode->item = value;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 在节点左侧插入
struct node* insertLeft(struct node* root, int value) {
root->left = createNode(value);
return root->left;
}
// 在节点右侧插入
struct node* insertRight(struct node* root, int value) {
root->right = createNode(value);
return root->right;
}
int main() {
struct node* root = createNode(1);
insertLeft(root, 2);
insertRight(root, 3);
insertLeft(root->left, 4);
printf("中序遍历 \n");
inorderTraversal(root);
printf("\n先序遍历 \n");
preorderTraversal(root);
printf("\n后序遍历 \n");
postorderTraversal(root);
}
C++中的二叉树应用
- 用于数据的快速和容易访问
- 在路由器算法中应用
- 用于实现堆数据结构
- 语法树
// C++中的二叉树
#include <stdlib.h>
#include <iostream>
using namespace std;
struct node {
int data;
struct node *left;
struct node *right;
};
// 创建新节点
struct node *newNode(int data) {
struct node *node = (struct node *)malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return (node);
}
// 前序遍历
void traversePreOrder(struct node *temp) {
if (temp != NULL) {
cout << " " << temp->data;
traversePreOrder(temp->left);
traversePreOrder(temp->right);
}
}
// 中序遍历
void traverseInOrder(struct node *temp) {
if (temp != NULL) {
traverseInOrder(temp->left);
cout << " " << temp->data;
traverseInOrder(temp->right);
}
}
// 后序遍历
void traversePostOrder(struct node *temp) {
if (temp != NULL) {
traversePostOrder(temp->left);
traversePostOrder(temp->right);
cout << " " << temp->data;
}
}
int main() {
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
cout << "preorder traversal: ";
traversePreOrder(root);
cout << "\nInorder traversal: ";
traverseInOrder(root);
cout << "\nPostorder traversal: ";
traversePostOrder(root);
}
二叉树的应用
- 用于快速方便地访问数据
- 在路由算法中使用
- 用于实现堆数据结构
- 语法树