树的最大路径和
https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
思路:
递归+遍历
最大路径和
按照一个树 比如【a,b,c】 实际是三选一问题:b+root 与c+root 或者 b+c+root
maxSum 用于更新最大和,treeMaxSum
int maxSum= Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {treeMaxSum(root);return maxSum;}public int treeMaxSum(TreeNode root){if (root==null) return 0;int left=Math.max(0,treeMaxSum(root.left));int right=Math.max(0,treeMaxSum(root.right));int tempMax=Math.max(left,right);tempMax=Math.max(tempMax,left+right);maxSum= Math.max(maxSum,tempMax+root.val);return Math.max(left,right)+root.val;}
根据前序 中序遍历结果还原二叉树
https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
思路:
遍历 + 递归
前序:根左右
中序:左根右
根据中序遍历 可以分出左子树与右子树, 记录根的下标记 rootIndex,左子树个数为rootIndex 前的个数leftNum,从而知道前序遍历中的start+leftNum+1开始是左子树,后面的全部是右子树。递归调用
public TreeNode buildTree(int[] preorder, int[] inorder) {return buildTree(preorder, 0, preorder.length , inorder, 0, inorder.length );}public TreeNode buildTree(int[] preorder, int p_start, int p_end,int[] inorder, int i_start, int i_end) {if (p_start &#61;&#61; p_end) {return null;}TreeNode treeNode &#61; new TreeNode(preorder[p_start]);int rootIndex &#61; 0;for (int i &#61; i_start; i < i_end; i&#43;&#43;) {if (inorder[i] &#61;&#61; preorder[p_start]) {rootIndex &#61; i;}}int leftNum &#61; rootIndex - i_start;treeNode.left &#61; buildTree(preorder, p_start&#43;1, p_start &#43;1&#43; leftNum , inorder, i_start, rootIndex );treeNode.right &#61; buildTree(preorder, p_start &#43;1&#43; leftNum, p_end, inorder, rootIndex &#43; 1, i_end);return treeNode;}
树按层遍历&#xff08;BFS&#xff09;
规律&#xff1a; 利用队列 &#xff0c;看作图的遍历
扩展&#xff1a; 可以求深度
public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> list &#61; new ArrayList<>();if (root&#61;&#61;null) return list;Deque<TreeNode> queue &#61; new ArrayDeque<>();queue.add(root);while (!queue.isEmpty()) {int size &#61; queue.size();List<Integer> levelResult &#61; new ArrayList<>();for (int i &#61; 0; i < size; i&#43;&#43;) {TreeNode cur &#61; queue.poll();levelResult.add(cur.val);if (cur.left !&#61; null) {queue.add(cur.left);}if (cur.right !&#61; null) {queue.add(cur.right);}}list.add(levelResult);}return list;}
树按深度遍历
非递归&#xff0c;利用栈实现
List<TreeNode> treeList ;public List<TreeNode> dfs(TreeNode root) {treeList &#61; new ArrayList<>();if(root&#61;&#61;null) {return null;}Stack<TreeNode> myStack&#61;new Stack<>();myStack.add(root);while(!myStack.isEmpty()) {TreeNode node&#61;myStack.pop(); treeList.add(node);if(node.right!&#61;null) {myStack.push(node.right);}if(node.left!&#61;null) {myStack.push(node.left);}}return treeList;}
递归
List<TreeNode> treeNodeList &#61; new ArrayList<>();;public List<TreeNode> dfsRec(TreeNode root) {if (root &#61;&#61; null) {return null;}treeNodeList.add(root);dfsRec(root.left);dfsRec(root.right);return treeNodeList;}