C/C++中二叉树的高度
时间:2020-02-23 14:29:58 来源:igfitidea点击:
二叉树的高度定义为任何叶节点距根节点的最大深度。
也就是说,它是从根节点到任何叶节点的最长路径的长度。
让我们考虑下面的二叉树。
由于对应于最大深度的叶节点为40和50,因此要找到高度,我们只需找到从根节点到这两个节点之一的边数,即3。
现在我们知道二叉树的高度表示什么,现在我们将构造一个算法来查找任何二叉树的高度。
在C++中查找二叉树的高度的逻辑
现在让我们决定寻找高度的逻辑,然后首先编写伪代码。
我们将在树上使用递归来找到高度。
(有关概念,请参阅Wikipedia文章)
由于树的高度定义为从根到叶的最大路径,因此我们可以递归计算左和右子树的高度。
现在我们可以在子树上应用高度的定义。
我们观察到它是左右子树之间的最大值,然后加一。
由于树的高度是子树的最大高度+ 1,因此我们一直这样做,直到子树变为" NULL",并且其高度为0。
至此,我们的功能将最终终止,并且
让我们编写一个用于计算高度的函数" tree_height()"。
//Find height of a tree, defined by the root node int tree_height(Node* root) { if (root == NULL) return 0; else { //Find the height of left, right subtrees left_height = tree_height(root->left); right_height = tree_height(root->right); //Find max(subtree_height) + 1 to get the height of the tree return max(left_height, right_height) + 1; }
当子树的大小为0或者根节点为NULL时,第3行评估终止条件。
第7和8行递归地找到左右子树的高度。
最后,第11行返回两者中的最大值,并返回树的高度。
用C/C++实现
下面是一个完整的程序,显示了如何构造二叉树,然后显示了在tree_height()
中查找高度的逻辑。
#include <stdio.h> #include <stdlib.h> typedef struct Node Node; //Define the Tree Node here struct Node { int value; //Pointers to the left and right children Node* left, *right; }; Node* init_tree(int data) { //Creates the tree and returns the //root node Node* root = (Node*) malloc (sizeof(Node)); root->left = root->right = NULL; root->value = data; return root; } Node* create_node(int data) { //Creates a new node Node* node = (Node*) malloc (sizeof(Node)); node->value = data; node->left = node->right = NULL; return node; } void free_tree(Node* root) { //Deallocates memory corresponding //to every node in the tree. Node* temp = root; if (!temp) return; free_tree(temp->left); free_tree(temp->right); if (!temp->left && !temp->right) { free(temp); return; } } int tree_height(Node* root) { //Get the height of the tree if (!root) return 0; else { //Find the height of both subtrees //and use the larger one int left_height = tree_height(root->left); int right_height = tree_height(root->right); if (left_height >= right_height) return left_height + 1; else return right_height + 1; } } int main() { //Program to demonstrate finding the height of a Binary Tree //Create the root node having a value of 10 Node* root = init_tree(10); //Insert nodes onto the tree root->left = create_node(20); root->right = create_node(30); root->left->left = create_node(40); root->left->right = create_node(50); //Find the height of the tree int height = tree_height(root); printf("Height of the Binary Tree: %d\n", height); //Free the tree! free_tree(root); return 0; }