您的位置:首页 > 其它

二叉树

2016-04-29 09:47 239 查看
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。

给定二叉树的根节点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");
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: