写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
package org.algorithm;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
public class GetTreeNum {
private int[] array = { 11, 32, 6, 2, 14, 54, 37, 81, 49 };//定义array数组
private static List<TreeNode> nodeList = null;
//二叉树类TreeNode
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
//利用array数组构造二叉树方法
public void createBinTree() {
nodeList = new LinkedList<TreeNode>();
// 将一个数组的值依次转换为Node节点
for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
nodeList.add(new TreeNode(array[nodeIndex]));
}
// 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
// 左孩子
nodeList.get(parentIndex).left = nodeList.get(parentIndex * 2 + 1);
// 右孩子
nodeList.get(parentIndex).right = nodeList.get(parentIndex * 2 + 2);
}
// 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
int lastParentIndex = array.length / 2 - 1;
// 左孩子
nodeList.get(lastParentIndex).left = nodeList
.get(lastParentIndex * 2 + 1);
// 右孩子,如果数组的长度为奇数才建立右孩子
if (array.length % 2 == 1) {
nodeList.get(lastParentIndex).right = nodeList
.get(lastParentIndex * 2 + 2);
}
}
//定义获取最大差绝对值方法
public int getMaxAbsNum(TreeNode root) {
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode p = root;
int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
if (root == null)
return 0;
while (p != null || !s.isEmpty()) {
while (p != null) {
if (max < p.val)
max = p.val;
if (min > p.val)
min = p.val;
s.push(p);
p = p.left;
}
if (!s.isEmpty()) {
p = s.peek();
s.pop();
p = p.right;
}
}
return Math.abs(max - min);
}
//方法入口
public static void main(String[] args) {
GetTreeNum getTree = new GetTreeNum();
getTree.createBinTree();
// nodeList中第0个索引处的值即为根节点
TreeNode root = nodeList.get(0);
int size=getTree.getMaxAbsNum(root);
System.out.println(size);
}
}