一次遍历中二叉树的密度
给定一棵二叉树,通过遍历它找到它的密度。
Density of Binary Tree = Size / Height
例子:
Input: Root of following tree
10
/ \
20 30
Output: 1.5
Height of given tree = 2
Size of given tree = 3
Input: Root of following tree
10
/
20
/
30
Output: 1
Height of given tree = 3
Size of given tree = 3
二叉树的密度表示二叉树的平衡程度。例如,倾斜树的密度最小,而完美树的密度最大。
我们强烈建议您最小化您的浏览器并首先自己尝试。
两个基于遍历的方法很简单。首先使用一次遍历找到高度,然后使用另一次遍历找到大小。最后返回两个值的比率。
为了在一次遍历中完成,我们计算二叉树的大小,同时找到它的高度。下面是 C++ 实现。
C++
//C++ program to find density of a binary tree
#include
// A binary tree node
struct Node
{
int data;
Node *left, *right;
};
// Helper function to allocates a new node
Node* newNode(int data)
{
Node* node = new Node;
node->data = data;
node->left = node->right = NULL;
return node;
}
// Function to compute height and
// size of a binary tree
int heighAndSize(Node* node, int &size)
{
if (node==NULL)
return 0;
// compute height of each subtree
int l = heighAndSize(node->left, size);
int r = heighAndSize(node->right, size);
//increase size by 1
size++;
//return larger of the two
return (l > r) ? l + 1 : r + 1;
}
//function to calculate density of a binary tree
float density(Node* root)
{
if (root == NULL)
return 0;
int size = 0; // To store size
// Finds height and size
int _height = heighAndSize(root, size);
return (float)size/_height;
}
// Driver code to test above methods
int main()
{
Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
printf("Density of given binary tree is %f",
density(root));
return 0;
}
Java
// Java program to find density of Binary Tree
// A binary tree node
class Node
{
int data;
Node left, right;
public Node(int data)
{
this.data = data;
left = right = null;
}
}
// Class to implement pass by reference of size
class Size
{
// variable to calculate size of tree
int size = 0;
}
class BinaryTree
{
Node root;
// Function to compute height and
// size of a binary tree
int heighAndSize(Node node, Size size)
{
if (node == null)
return 0;
// compute height of each subtree
int l = heighAndSize(node.left, size);
int r = heighAndSize(node.right, size);
//increase size by 1
size.size++;
//return larger of the two
return (l > r) ? l + 1 : r + 1;
}
//function to calculate density of a binary tree
float density(Node root)
{
Size size = new Size();
if (root == null)
return 0;
// Finds height and size
int _height = heighAndSize(root, size);
return (float) size.size / _height;
}
// Driver code to test above methods
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);
System.out.println("Density of given Binary Tree is : "
+ tree.density(tree.root));
}
}
// This code has been contributed by Mayank Jaiswal(mayank_24)
Python3
# Python3 program to find density
# of a binary tree
# A binary tree node
# Helper function to allocates a new node
class newNode:
def __init__(self, data):
self.data = data
self.left = self.right = None
# Function to compute height and
# size of a binary tree
def heighAndSize(node, size):
if (node == None) :
return 0
# compute height of each subtree
l = heighAndSize(node.left, size)
r = heighAndSize(node.right, size)
#increase size by 1
size[0] += 1
# return larger of the two
return l + 1 if(l > r) else r + 1
# function to calculate density
# of a binary tree
def density(root):
if (root == None) :
return 0
size = [0] # To store size
# Finds height and size
_height = heighAndSize(root, size)
return size[0] / _height
# Driver Code
if __name__ == '__main__':
root = newNode(1)
root.left = newNode(2)
root.right = newNode(3)
print("Density of given binary tree is ",
density(root))
# This code is contributed
# by SHUBHAMSINGH10
C#
// C# program to find density
// of Binary Tree
using System;
// A binary tree node
class Node
{
public int data;
public Node left, right;
public Node(int data)
{
this.data = data;
left = right = null;
}
}
// Class to implement pass
// by reference of size
class Size
{
// variable to calculate
// size of tree
public int size = 0;
}
class BinaryTree
{
Node root;
// Function to compute height
// and size of a binary tree
int heighAndSize(Node node,
Size size)
{
if (node == null)
return 0;
// compute height of each subtree
int l = heighAndSize(node.left, size);
int r = heighAndSize(node.right, size);
//increase size by 1
size.size++;
//return larger of the two
return (l > r) ? l + 1 : r + 1;
}
// function to calculate density
// of a binary tree
float density(Node root)
{
Size size = new Size();
if (root == null)
return 0;
// Finds height and size
int _height = heighAndSize(root, size);
return (float) size.size / _height;
}
// Driver code
static public 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);
Console.WriteLine("Density of given " +
"Binary Tree is : " +
tree.density(tree.root));
}
}
// This code is contributed
// by Arnab Kundu
Javascript
输出:
Density of given binary tree is 1.5
https://www.youtube.com/watch?v=g
-SaPOyRofU