举个例子如下:
实现的代码如下:
import java.util.Stack;
import java.util.HashMap;
//构造数组的MaxTree
public class MaxTree{
//二叉树结点的定义如下
public static class Node{
public int value;
public Node left;
public Node right;
//结点的初始化
public Node(int data)
{
this.value=data;
}
}
//构造数组的MaxTree函数
public static Node getMaxTree(int[] arr) {
Node[] nArr = new Node[arr.length]; //存放二叉树结点的数组
for (int i = 0; i != arr.length; i++) {
nArr[i] = new Node(arr[i]);
}
Stack<Node> stack = new Stack<Node>();//利用栈找出左右边第一个比自身大的数
HashMap<Node, Node> lBigMap = new HashMap<Node, Node>();
HashMap<Node, Node> rBigMap = new HashMap<Node, Node>();
for (int i = 0; i != nArr.length; i++) {
Node curNode = nArr[i];
while ((!stack.isEmpty()) && stack.peek().value < curNode.value) {
popStackSetMap(stack, lBigMap);//栈的一系列操作
}
stack.push(curNode);
}
while (!stack.isEmpty()) {
popStackSetMap(stack, lBigMap);
}
for (int i = nArr.length - 1; i != -1; i--) {
Node curNode = nArr[i];
while ((!stack.isEmpty()) && stack.peek().value < curNode.value) {
popStackSetMap(stack, rBigMap);//栈的一系列操作
}
stack.push(curNode);
}
while (!stack.isEmpty()) {
popStackSetMap(stack, rBigMap);
}
Node head = null; //声明头结点
for (int i = 0; i != nArr.length; i++) {
Node curNode = nArr[i];
Node left = lBigMap.get(curNode);
Node right = rBigMap.get(curNode);
if (left == null && right == null) {
head = curNode;
} else if (left == null) {
if (right.left == null) {
right.left = curNode;
} else {
right.right = curNode;
}
} else if (right == null) {
if (left.left == null) {
left.left = curNode;
} else {
left.right = curNode;
}
} else {
//选择左右较小的数为父节点
Node parent = left.value < right.value ? left : right;
if (parent.left == null) {
parent.left = curNode;
} else {
parent.right = curNode;
}
}
}
return head;
}
//栈的一系列操作
public static void popStackSetMap(Stack <Node>stack,HashMap<Node,Node>map)
{
Node popNode=stack.pop();
if(stack.isEmpty())
{
map.put(popNode,null);
}
else
{
map.put(popNode,stack.peek()); //构造二叉树操作
}
}
//二叉树的先序遍历
public static void printPreOrder(Node head)
{
if(head==null)
{
return;
}
System.out.print(head.value+" ");
printPreOrder(head.left); //递归调用遍历二叉树
printPreOrder(head.right);
}
//二叉树的中序遍历
public static void printInOrder(Node head)
{
if(head==null)
{
return;
}
printPreOrder(head.left);
System.out.print(head.value+" ");
printPreOrder(head.right);
}
public static void main(String []args)
{
int []arr={3,4,5,1,2};
Node head=getMaxTree(arr);
printPreOrder(head);
System.out.println();
printInOrder(head);
}
}