题号 | 题目 |
---|---|
124 | 二叉树中的最大路径和 |
105 | 从前序与中序遍历序列构造二叉树 |
230 | 二叉搜索树中第K小的元素 |
定义二叉树节点类TreeNode
Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
124.二叉树中的最大路径和
class Solution {
private int res = Integer.MIN_VALUE;
private int oneSideMax(TreeNode root) {
if (root == null)
return 0;
// 遍历框架
int left = Math.max(0, oneSideMax(root.left));
int right = Math.max(0, oneSideMax(root.right));
// 后序位置
res = Math.max(res, left + right + root.val);
return Math.max(left, right) + root.val;
}
public int maxPathSum(TreeNode root) {
oneSideMax(root);
return res;
}
}
注意递归函数的位置,这就是后序遍历嘛,无非就是把traverse函数名字改成了oneSideMax了
105.从前序与中序遍历序列构造二叉树
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTree(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
}
public TreeNode buildTree(int[] preorder, int[] inorder,int preStart ,int preEnd,int inStart,int inEnd) {
// 前序位置,寻找左右子数的索引
if(preStart > preEnd){
return null;
}
int rootVal = preorder[preStart];
int index = 0;
for(int i=inStart;i<=inEnd;i++){ // 寻找根节点在中序遍历中的索引
if(inorder[i] == rootVal){
index = i;
break;
}
}
int left = index - inStart; // 左子树节点个数
TreeNode root = new TreeNode(rootVal);
// 递归构造左右子树
root.left = buildTree(preorder,inorder,preStart+1,preStart+left,inStart,index-1);
root.right = buildTree(preorder,inorder,preStart+left+1,preEnd,index+1,inEnd); // 右子树节点个数
return root;
}
}
经典问题,根据前序遍历和中序遍历还原一棵二叉树,虽然这个函数的参数比较多,但是它主要是控制数组的索引而已,注意到build的位置,本质上该算法也就是一个前序遍历,因为它在前序遍历的位置上加了一个代码逻辑。
230.二叉搜索树中第K小的元素
class Solution {
int res = 0;
int rank =0;
public int kthSmallest(TreeNode root, int k) {
traverse(root, k);
return res;
}
private void traverse(TreeNode root, int k) {
if (root == null) {
return;
}
traverse(root.left, k);
// 中序遍历代码位置
rank++;
if (k == rank) {
res = root.val;
return;
}
traverse(root.right, k);
}
}
中序遍历对于一棵二叉搜索树意味着什么?
所以只要是涉及到递归的问题,都是树的问题。