Perfektný binárny strom

V tomto návode sa dozviete o dokonalom binárnom strome. Nájdete tiež pracovné príklady na kontrolu dokonalého binárneho stromu v jazykoch C, C ++, Java a Python.

Perfektný binárny strom je typ binárneho stromu, v ktorom má každý vnútorný uzol presne dva podradené uzly a všetky listové uzly sú na rovnakej úrovni.

Perfektný binárny strom

Všetky vnútorné uzly majú stupeň 2.

Perfektný binárny strom možno rekurzívne definovať ako:

  1. Ak jediný uzol nemá potomkov, je to dokonalý binárny strom výšky h = 0,
  2. Ak uzol má h> 0, je to dokonalý binárny strom, ak sú obidva jeho podstromy vysoké h - 1a neprekrývajú sa.
Perfektný binárny strom (rekurzívne znázornenie)

Príklady jazyka Python, Java a C / C ++

Nasledujúci kód slúži na kontrolu, či je strom dokonalým binárnym stromom.

Python Java C C ++
 # Checking if a binary tree is a perfect binary tree in Python class newNode: def __init__(self, k): self.key = k self.right = self.left = None # Calculate the depth def calculateDepth(node): d = 0 while (node is not None): d += 1 node = node.left return d # Check if the tree is perfect binary tree def is_perfect(root, d, level=0): # Check if the tree is empty if (root is None): return True # Check the presence of trees if (root.left is None and root.right is None): return (d == level + 1) if (root.left is None or root.right is None): return False return (is_perfect(root.left, d, level + 1) and is_perfect(root.right, d, level + 1)) root = None root = newNode(1) root.left = newNode(2) root.right = newNode(3) root.left.left = newNode(4) root.left.right = newNode(5) if (is_perfect(root, calculateDepth(root))): print("The tree is a perfect binary tree") else: print("The tree is not a perfect binary tree")
 // Checking if a binary tree is a perfect binary tree in Java class PerfectBinaryTree ( static class Node ( int key; Node left, right; ) // Calculate the depth static int depth(Node node) ( int d = 0; while (node != null) ( d++; node = node.left; ) return d; ) // Check if the tree is perfect binary tree static boolean is_perfect(Node root, int d, int level) ( // Check if the tree is empty if (root == null) return true; // If for children if (root.left == null && root.right == null) return (d == level + 1); if (root.left == null || root.right == null) return false; return is_perfect(root.left, d, level + 1) && is_perfect(root.right, d, level + 1); ) // Wrapper function static boolean is_Perfect(Node root) ( int d = depth(root); return is_perfect(root, d, 0); ) // Create a new node static Node newNode(int k) ( Node node = new Node(); node.key = k; node.right = null; node.left = null; return node; ) public static void main(String args()) ( Node root = null; root = newNode(1); root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); if (is_Perfect(root) == true) System.out.println("The tree is a perfect binary tree"); else System.out.println("The tree is not a perfect binary tree"); ) )
 // Checking if a binary tree is a perfect binary tree in C #include #include #include struct node ( int data; struct node *left; struct node *right; ); // Creating a new node 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); ) // Calculate the depth int depth(struct node *node) ( int d = 0; while (node != NULL) ( d++; node = node->left; ) return d; ) // Check if the tree is perfect bool is_perfect(struct node *root, int d, int level) ( // Check if the tree is empty if (root == NULL) return true; // Check the presence of children if (root->left == NULL && root->right == NULL) return (d == level + 1); if (root->left == NULL || root->right == NULL) return false; return is_perfect(root->left, d, level + 1) && is_perfect(root->right, d, level + 1); ) // Wrapper function bool is_Perfect(struct node *root) ( int d = depth(root); return is_perfect(root, d, 0); ) int main() ( struct node *root = NULL; root = newnode(1); root->left = newnode(2); root->right = newnode(3); root->left->left = newnode(4); root->left->right = newnode(5); root->right->left = newnode(6); if (is_Perfect(root)) printf("The tree is a perfect binary tree"); else printf("The tree is not a perfect binary tree"); )
 // Checking if a binary tree is a perfect binary tree in C++ #include using namespace std; struct Node ( int key; struct Node *left, *right; ); int depth(Node *node) ( int d = 0; while (node != NULL) ( d++; node = node->left; ) return d; ) bool isPerfectR(struct Node *root, int d, int level = 0) ( if (root == NULL) return true; if (root->left == NULL && root->right == NULL) return (d == level + 1); if (root->left == NULL || root->right == NULL) return false; return isPerfectR(root->left, d, level + 1) && isPerfectR(root->right, d, level + 1); ) bool isPerfect(Node *root) ( int d = depth(root); return isPerfectR(root, d); ) struct Node *newNode(int k) ( struct Node *node = new Node; node->key = k; node->right = node->left = NULL; return node; ) int main() ( struct Node *root = NULL; root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); root->right->left = newNode(6); if (isPerfect(root)) cout << "The tree is a perfect binary tree"; else cout << "The tree is not a perfect binary tree"; )

Perfektné vety o binárnych stromoch

  1. Dokonalý binárny strom výšky h má uzol.2h + 1 - 1
  2. Dokonalý binárny strom s n uzlami má výšku log(n + 1) - 1 = Θ(ln(n)).
  3. Dokonalý binárny strom výšky h má listové uzly.2h
  4. Priemerná hĺbka uzla v dokonalom binárnom strome je Θ(ln(n)).

Zaujímavé články...