二叉树
2016-04-29 09:47
239 查看
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
给定二叉树的根节点root,请返回所求距离。
思路:首先这颗二叉树的性质是左孩子小于根结点,右孩子的权值大于根结点。二叉树先序遍历,找到权值最大和权值最小的点,并用数组记录他们到根结点的路径,然后距离就是他们到根结点的路径的长度减去2*他们重复的路径长度。
给定二叉树的根节点root,请返回所求距离。
思路:首先这颗二叉树的性质是左孩子小于根结点,右孩子的权值大于根结点。二叉树先序遍历,找到权值最大和权值最小的点,并用数组记录他们到根结点的路径,然后距离就是他们到根结点的路径的长度减去2*他们重复的路径长度。
import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }*/ public class Tree { public TreeNode[] nodes = new TreeNode[2]; public String paths[] = new String[2]; public int getDis(TreeNode root) { for (int i = 0; i < 2; i++) { nodes[0] = new TreeNode(Integer.MIN_VALUE); nodes[1] = new TreeNode(Integer.MAX_VALUE); paths[0] = ""; paths[1] = ""; } findMaxAndMin(root, ""); int a = paths[0].length(); int b = paths[1].length(); int c = 0; int d = Math.min(a, b); for (int i = 0; i < d; i++) { if (paths[0].charAt(i) == paths[1].charAt(i)) c++; else break; } return a + b - 2 * c; } public void findMaxAndMin(TreeNode root, String path) { if (root == null) return; else { if (root.left == null && root.right == null) { if (nodes[0].val < root.val) { nodes[0] = root; paths[0] = path; } if (nodes[1].val > root.val) { nodes[1] = root; paths[1] = path; } } else { findMaxAndMin(root.left, path + "0"); findMaxAndMin(root.right, path + "1"); } } } }
相关文章推荐
- 水水笔
- CentOS 7 yum install mysql
- Mysql InnoDB存储引擎有三大特性之一的 - 插入缓冲(insert buffer)
- VIM
- Java:String和Date、Timestamp之间的转换
- 链接脚本学习
- mybatis_generator_逆向工程
- 一种怪异的节点删除方式
- nginx proxy的使用
- MongoDB入门教程(一)
- mybatis实现拦截器的方法
- 【加密解密】对字符串的加密解密
- [寻路][导航][算法][地图开发]寻路算法的对比优势2
- mysql更改表id自增数AUTO_INCREMENT
- 在ASP.NET 2.0中操作数据之四:使用ObjectDataSource展现数据
- 水声成像之基本概念
- java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)
- 文本特征提取方法研究
- iOS开发多线程篇—线程间的通信
- Difference between start and run method in Thread – Java Tutorial