数据结构——二叉树的直径
来源:互联网 发布:蓝桥杯c语言试题及答案 编辑:程序博客网 时间:2024/05/16 06:06
原文地址:Diameter of a Binary Tree
树的直径(有时也称作宽度),指的是树中的两个叶子节点之间最长路径的节点的数目,下面的图显示了两个树的直径都是9,形成最长路径的两个端点的叶子节点被加上了阴影(注意每个树中长度为9的路径不止一个,但是没有比9再更长的路径了)。
![这里写图片描述](http://img.blog.csdn.net/20161126152341449)一个树T的直径是下面几条里面最长的: - T的左子树的直径 - T的右子树的直径 - 两个叶子之间穿过T的根的最长路径(这个可以通过计算这个树的子树的高度获得)实现:
// Recursive optimized Java program to find the diameter of a// Binary Tree/* Class containing left and right child of current node and key value*/class Node{ int data; Node left, right; public Node(int item) { data = item; left = right = null; }}/* Class to print the Diameter */class BinaryTree{ Node root; /* Method to calculate the diameter and return it to main */ int diameter(Node root) { /* base case if tree is empty */ if (root == null) return 0; /* get the height of left and right sub trees */ int lheight = height(root.left); int rheight = height(root.right); /* get the diameter of left and right subtrees */ int ldiameter = diameter(root.left); int rdiameter = diameter(root.right); /* Return max of following three 1) Diameter of left subtree 2) Diameter of right subtree 3) Height of left subtree + height of right subtree + 1 */ return Math.max(lheight + rheight + 1, Math.max(ldiameter, rdiameter)); } /* A wrapper over diameter(Node root) */ int diameter() { return diameter(root); } /*The function Compute the "height" of a tree. Height is the number f nodes along the longest path from the root node down to the farthest leaf node.*/ static int height(Node node) { /* base case tree is empty */ if (node == null) return 0; /* If tree is not empty then height = 1 + max of left height and right heights */ return (1 + Math.max(height(node.left), height(node.right))); } public static void main(String args[]) { /* creating a binary tree and entering the nodes */ BinaryTree tree = new BinaryTree(); tree.root = new Node(1); tree.root.left = new Node(2); tree.root.right = new Node(3); tree.root.left.left = new Node(4); tree.root.left.right = new Node(5); System.out.println("The diameter of given binary tree is : " + tree.diameter()); }}
时间复杂度:O(n^2)
输出:
Diameter of the given binary tree is 4
实现优化:以上实现可以通过在相同的递归,而不是分别调用height()来计算高度实现优化,感谢Amar 建议这个优化的版本。这个优化将时间减少到:O(n)。
// Recursive Java program to find the diameter of a// Binary Tree/* Class containing left and right child of current node and key value*/class Node{ int data; Node left, right; public Node(int item) { data = item; left = right = null; }}// A utility class to pass heigh objectclass Height{ int h;}/* Class to print the Diameter */class BinaryTree{ Node root; /* define height =0 globally and call diameterOpt(root,height) from main */ int diameterOpt(Node root, Height height) { /* lh --> Height of left subtree rh --> Height of right subtree */ Height lh = new Height(), rh = new Height(); if (root == null) { height.h = 0; return 0; /* diameter is also 0 */ } /* ldiameter --> diameter of left subtree rdiameter --> Diameter of right subtree */ /* Get the heights of left and right subtrees in lh and rh And store the returned values in ldiameter and ldiameter */ lh.h++; rh.h++; int ldiameter = diameterOpt(root.left, lh); int rdiameter = diameterOpt(root.right, rh); /* Height of current node is max of heights of left and right subtrees plus 1*/ height.h = Math.max(lh.h, rh.h) + 1; return Math.max(lh.h + rh.h + 1, Math.max(ldiameter, rdiameter)); } /* A wrapper over diameter(Node root) */ int diameter() { Height height = new Height(); return diameterOpt(root, height); } /*The function Compute the "height" of a tree. Height is the number f nodes along the longest path from the root node down to the farthest leaf node.*/ static int height(Node node) { /* base case tree is empty */ if (node == null) return 0; /* If tree is not empty then height = 1 + max of left height and right heights */ return (1 + Math.max(height(node.left), height(node.right))); } public static void main(String args[]) { /* creating a binary tree and entering the nodes */ BinaryTree tree = new BinaryTree(); tree.root = new Node(1); tree.root.left = new Node(2); tree.root.right = new Node(3); tree.root.left.left = new Node(4); tree.root.left.right = new Node(5); System.out.println("The diameter of given binary tree is : " + tree.diameter()); }}
时间复杂度:O(n)
输出:
4
参考文献:
http://www.cs.duke.edu/courses/spring00/cps100/assign/trees/diameter.html
0 0
- 数据结构——二叉树的直径
- 数据结构中树的直径问题
- 数据结构—二叉树
- hdu4607—Park Visit(树的直径)
- 数据结构——二叉树的遍历
- 数据结构——二叉树的遍历
- 数据结构——二叉树的遍历
- 数据结构——二叉树的操作
- 数据结构——二叉树的遍历
- 数据结构——二叉树的遍历
- 数据结构——二叉树的实现
- 数据结构——二叉树的遍历
- 数据结构——二叉树的特性
- 数据结构——二叉树的类型
- 数据结构—二叉树的构造
- 数据结构 — 二叉树的线索化
- 数据结构—— 二叉树数据结构的节点删除问题
- 【二叉树】树的直径【543. Diameter of Binary Tree】
- POJ2337 Catenyms 字典序输出欧拉路径
- 新手学习selenium 2.0+python 2.7.11+firefox46的环境配置
- 在MFC上显示mat格式图片
- spring 源码探索--bean加载准备阶段
- 《算法》之惊鸿一瞥
- 数据结构——二叉树的直径
- JavaScript
- bzoj1061
- 空闲时间学一个Linux命令(8)—— cp 命令
- SpringMVC中文件上传和json数据配置
- Usaco 4.1.1 Beef McNuggets——当Gcd(p,q)=1时,最大无法表示成px+qy(x,y>=0)的数是pq-p-q
- ARM和X86架构之间区别以及性能比较杂谈
- java网络编程初步理解
- AUPE——Chapter 11:线程