二叉树特性:

前序排列:1、3、6、5、2、4
中序排列:6、3、5、1、2、4
后序排列:6、5、3、4、2、1
层序排列:1、3、2、6、5、4
根据前序和中序还原二叉树(后序中序同理)
//根据前序节点得到root节点//循环从中序中root节点的下标i找到//左节点=把中序从0到i,前序从1到i+1放到方法中递归//右节点=把中序从i+1到中序最后,前序从i+1到前序最后public static TreeNode reConstruct_PreMid(int[] preOrder, int[] midOrder) {if (preOrder.length == 0 || midOrder.length == 0) {return null;}// preOrder[0] 必定是root根节点TreeNode root = new TreeNode(preOrder[0]);for (int i = 0; i < midOrder.length; i++) {if (preOrder[0] == midOrder[i]) {root.leftChild = reConstruct_PreMid(Arrays.copyOfRange(preOrder, 1, i + 1),Arrays.copyOfRange(midOrder, 0, i));root.rightChild = reConstruct_PreMid(Arrays.copyOfRange(preOrder, i + 1, preOrder.length),Arrays.copyOfRange(midOrder, i + 1, midOrder.length));}}return root;}
根据层序和中序还原二叉树
//根据层序第一个节点是root节点找出mid中root节点的下标i//如果层序的长度大于2,就进行下一步,否则返回root节点//判断层序第二个节点是左子树还是右子树()//如果为左子树,//左节点=获取层序数列中左子树的层序,再递归执行//右节点=如果层序len大于等于3,且层序第三个节点为右节点,则获取右节点层序,递归执行//如果为右子树,则获取右子树的层序,递归执行//判断左子树:循环中序,如果等于root节点值就返回,如果等于目标节点则标志为左节点//获取子层序:中序根据root节点,传入左或者右节点序列,再根据原层序一一比对,找出相同的则为子层序public static TreeNode buildTreeByMidLevel(int[] levelOrder, int[] midOrder, int midBegin, int midEnd) {if (levelOrder.length == 0 || midOrder.length == 0) {return null;}// levelOrder[0] 必定是root根节点TreeNode root = new TreeNode(levelOrder[0]);// rootLocation:(子)序列中根节点的位置int rootLocation = -1;for (int i = midBegin; i <= midEnd; i++) {if (midOrder[i] == levelOrder[0]) {rootLocation = i;break;}}// 划分左右子树// levelOrder.length会影响划分if (levelOrder.length >= 2) {if (isLeft(midOrder, levelOrder[0], levelOrder[1])) {// 左子树root.leftChild = buildTreeByMidLevel(getLevelStr(midOrder, midBegin, rootLocation - 1, levelOrder),midOrder, midBegin, rootLocation - 1);// 处理左子树为空的情况,注意levelOrder.length需>=3if (levelOrder.length >= 3 && !isLeft(midOrder, levelOrder[0], levelOrder[2])) {root.rightChild = buildTreeByMidLevel(getLevelStr(midOrder, rootLocation + 1, midEnd, levelOrder),midOrder, rootLocation + 1, midEnd);}} else {// 右子树root.rightChild = buildTreeByMidLevel(getLevelStr(midOrder, rootLocation + 1, midEnd, levelOrder),midOrder, rootLocation + 1, midEnd);}}return root;}public static boolean isLeft(int[] order, int root, int child) {boolean findVal = false;for (int temp : order) {if (temp == child) {findVal = true;} else if (temp == root) {return findVal;}}return false;}public static int[] getLevelStr(int[] midOrder, int midBegin, int midEnd, int[] levelOrder) {int[] result = new int[midEnd - midBegin + 1];int curLoc = 0;for (int i = 0; i < levelOrder.length; i++) {if (contains(midOrder, levelOrder[i], midBegin, midEnd)) {result[curLoc++] = levelOrder[i];}}return result;}public static boolean contains(int[] midOrder, int target, int midBegin, int midEnd) {for (int i = midBegin; i <= midEnd; i++) {if (midOrder[i] == target) {return true;}}return false;}
找出每层最大值
import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;public class Main {public static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int data) {this.val = data;}}//找出二叉树每层的最大值节点public static void findMaxNodeInLevel(TreeNode pRoot) {ArrayList<Integer> resultList = new ArrayList<>();Queue<TreeNode> layer = new LinkedList<TreeNode>();ArrayList<Integer> layerList = new ArrayList<Integer>();layer.add(pRoot);int start = 0, end = 1;while (!layer.isEmpty()) {TreeNode cur = layer.remove();layerList.add(cur.val);start++;if (cur.left != null) {layer.add(cur.left);}if (cur.right != null) {layer.add(cur.right);}if (start == end) {end = layer.size();start = 0;resultList.add(findMaxNode(layerList));layerList = new ArrayList<Integer>();}}for (Integer i : resultList) {System.out.println(i);}}public static int findMaxNode(ArrayList<Integer> list) {int max = Integer.MIN_VALUE;for (Integer i : list) {if (max < i) {max = i;}}return max;}public static void main(String[] args) {TreeNode head = new TreeNode(1);head.left = new TreeNode(2);head.right = new TreeNode(3);head.left.left = new TreeNode(4);head.left.right = new TreeNode(5);head.right.left = new TreeNode(6);head.right.right = new TreeNode(7);findMaxNodeInLevel(head);}}
求最大宽度
public static int getMaxWidth2(Node head) {if (head == null) {return 0;}//当前层最后一个结点Node curEnd = head;//下一层最后一个结点Node nextEnd = null;//当前层结点数int curLevelNodes = 0;//结点数最多的层的结点数int max = Integer.MIN_VALUE;Queue<Node> queue = new LinkedList<>();queue.add(head);while (!queue.isEmpty()) {head = queue.poll();curLevelNodes++;if (head.left != null) {queue.add(head.left);nextEnd = head.left;}if (head.right != null) {queue.add(head.right);nextEnd = head.right;}if (head == curEnd) {max = Math.max(max, curLevelNodes);curLevelNodes = 0;curEnd = nextEnd;nextEnd = null;}}return max;}
