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;
}

