原文: https://www.programiz.com/dsa/binary-tree

在本教程中,您将学习二叉树及其不同类型。 另外,您还将找到 C,C++ ,Java 和 Python 中二叉树的工作示例。

二叉树是一种树数据结构,其中每个父节点最多可以有两个子节点。

例如:在下图中,每个元素最多有两个子代。

二叉树 - 图1

二叉树


二叉树的类型

满二叉树

满二叉树是二叉树的一种特殊类型,其中每个父节点/内部节点都有两个或没有子节点。

二叉树 - 图2

满二叉树

要了解更多信息,请访问满二叉树

完美二叉树

完美二叉树是一种二叉树,其中每个内部节点恰好有两个子节点,而所有叶节点都处于同一级别。

二叉树 - 图3

完美二叉树

要了解更多信息,请访问完美二叉树

完全二叉树

完全二叉树就像满二叉树,但有两个主要区别

  1. 每个级别都必须完全填满
  2. 所有叶子元素都必须向左倾斜。
  3. 最后一个叶子元素可能没有正确的同级,即满完全二叉树不必是满二叉树。

二叉树 - 图4

完全二叉树

要了解更多信息,请访问完全二叉树

退化树或病态树

退化或病态的树是具有左右一个独生子的树。

二叉树 - 图5

退化树

偏二叉树

偏二叉树是一种病态/退化的树,其中该树由左节点或右节点支配。 因此,存在两种类型的斜二叉树:左斜二叉树右斜二叉树

二叉树 - 图6

偏二叉树

平衡二叉树

它是一种二叉树,其中每个节点的左和右子树之间的差为 0 或 1。

二叉树 - 图7

平衡二叉树

要了解更多信息,请访问平衡二叉树


二叉树表示

二叉树的节点由包含数据部分和两个指向相同类型其他结构的指针的结构表示。

  1. struct node
  2. {
  3. int data;
  4. struct node *left;
  5. struct node *right;
  6. };

二叉树 - 图8

二叉树表示


Python,Java 和 C/C++ 示例

  1. # Binary Tree in Python
  2. class Node:
  3. def __init__(self, key):
  4. self.left = None
  5. self.right = None
  6. self.val = key
  7. # Traverse preorder
  8. def traversePreOrder(self):
  9. print(self.val, end=' ')
  10. if self.left:
  11. self.left.traversePreOrder()
  12. if self.right:
  13. self.right.traversePreOrder()
  14. # Traverse inorder
  15. def traverseInOrder(self):
  16. if self.left:
  17. self.left.traverseInOrder()
  18. print(self.val, end=' ')
  19. if self.right:
  20. self.right.traverseInOrder()
  21. # Traverse postorder
  22. def traversePostOrder(self):
  23. if self.left:
  24. self.left.traversePostOrder()
  25. if self.right:
  26. self.right.traversePostOrder()
  27. print(self.val, end=' ')
  28. root = Node(1)
  29. root.left = Node(2)
  30. root.right = Node(3)
  31. root.left.left = Node(4)
  32. print("Pre order Traversal: ", end="")
  33. root.traversePreOrder()
  34. print("\nIn order Traversal: ", end="")
  35. root.traverseInOrder()
  36. print("\nPost order Traversal: ", end="")
  37. root.traversePostOrder()
  1. // Binary Tree in Java
  2. // Node creation
  3. class Node {
  4. int key;
  5. Node left, right;
  6. public Node(int item) {
  7. key = item;
  8. left = right = null;
  9. }
  10. }
  11. class BinaryTree {
  12. Node root;
  13. BinaryTree(int key) {
  14. root = new Node(key);
  15. }
  16. BinaryTree() {
  17. root = null;
  18. }
  19. // Traverse Inorder
  20. public void traverseInOrder(Node node) {
  21. if (node != null) {
  22. traverseInOrder(node.left);
  23. System.out.print(" " + node.key);
  24. traverseInOrder(node.right);
  25. }
  26. }
  27. // Traverse Postorder
  28. public void traversePostOrder(Node node) {
  29. if (node != null) {
  30. traversePostOrder(node.left);
  31. traversePostOrder(node.right);
  32. System.out.print(" " + node.key);
  33. }
  34. }
  35. // Traverse Preorder
  36. public void traversePreOrder(Node node) {
  37. if (node != null) {
  38. System.out.print(" " + node.key);
  39. traversePreOrder(node.left);
  40. traversePreOrder(node.right);
  41. }
  42. }
  43. public static void main(String[] args) {
  44. BinaryTree tree = new BinaryTree();
  45. tree.root = new Node(1);
  46. tree.root.left = new Node(2);
  47. tree.root.right = new Node(3);
  48. tree.root.left.left = new Node(4);
  49. System.out.print("Pre order Traversal: ");
  50. tree.traversePreOrder(tree.root);
  51. System.out.print("\nIn order Traversal: ");
  52. tree.traverseInOrder(tree.root);
  53. System.out.print("\nPost order Traversal: ");
  54. tree.traversePostOrder(tree.root);
  55. }
  56. }
  1. // Tree traversal in C
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. struct node {
  5. int item;
  6. struct node* left;
  7. struct node* right;
  8. };
  9. // Inorder traversal
  10. void inorderTraversal(struct node* root) {
  11. if (root == NULL) return;
  12. inorderTraversal(root->left);
  13. printf("%d ->", root->item);
  14. inorderTraversal(root->right);
  15. }
  16. // Preorder traversal
  17. void preorderTraversal(struct node* root) {
  18. if (root == NULL) return;
  19. printf("%d ->", root->item);
  20. preorderTraversal(root->left);
  21. preorderTraversal(root->right);
  22. }
  23. // Postorder traversal
  24. void postorderTraversal(struct node* root) {
  25. if (root == NULL) return;
  26. postorderTraversal(root->left);
  27. postorderTraversal(root->right);
  28. printf("%d ->", root->item);
  29. }
  30. // Create a new Node
  31. struct node* createNode(value) {
  32. struct node* newNode = malloc(sizeof(struct node));
  33. newNode->item = value;
  34. newNode->left = NULL;
  35. newNode->right = NULL;
  36. return newNode;
  37. }
  38. // Insert on the left of the node
  39. struct node* insertLeft(struct node* root, int value) {
  40. root->left = createNode(value);
  41. return root->left;
  42. }
  43. // Insert on the right of the node
  44. struct node* insertRight(struct node* root, int value) {
  45. root->right = createNode(value);
  46. return root->right;
  47. }
  48. int main() {
  49. struct node* root = createNode(1);
  50. insertLeft(root, 2);
  51. insertRight(root, 3);
  52. insertLeft(root->left, 4);
  53. printf("Inorder traversal \n");
  54. inorderTraversal(root);
  55. printf("\nPreorder traversal \n");
  56. preorderTraversal(root);
  57. printf("\nPostorder traversal \n");
  58. postorderTraversal(root);
  59. }
  1. // Binary Tree in C++
  2. #include <stdlib.h>
  3. #include <iostream>
  4. using namespace std;
  5. struct node {
  6. int data;
  7. struct node *left;
  8. struct node *right;
  9. };
  10. // New node creation
  11. struct node *newNode(int data) {
  12. struct node *node = (struct node *)malloc(sizeof(struct node));
  13. node->data = data;
  14. node->left = NULL;
  15. node->right = NULL;
  16. return (node);
  17. }
  18. // Traverse Preorder
  19. void traversePreOrder(struct node *temp) {
  20. if (temp != NULL) {
  21. cout << " " << temp->data;
  22. traversePreOrder(temp->left);
  23. traversePreOrder(temp->right);
  24. }
  25. }
  26. // Traverse Inorder
  27. void traverseInOrder(struct node *temp) {
  28. if (temp != NULL) {
  29. traverseInOrder(temp->left);
  30. cout << " " << temp->data;
  31. traverseInOrder(temp->right);
  32. }
  33. }
  34. // Traverse Postorder
  35. void traversePostOrder(struct node *temp) {
  36. if (temp != NULL) {
  37. traversePostOrder(temp->left);
  38. traversePostOrder(temp->right);
  39. cout << " " << temp->data;
  40. }
  41. }
  42. int main() {
  43. struct node *root = newNode(1);
  44. root->left = newNode(2);
  45. root->right = newNode(3);
  46. root->left->left = newNode(4);
  47. cout << "preorder traversal: ";
  48. traversePreOrder(root);
  49. cout << "\nInorder traversal: ";
  50. traverseInOrder(root);
  51. cout << "\nPostorder traversal: ";
  52. traversePostOrder(root);
  53. }

二叉树应用

  • 轻松快速地访问数据
  • 在路由器算法中
  • 实现堆数据结构
  • 语法树