二叉树的直径
dfs
-
一条路径的长度等于路径经过的节点数减一
-
直径=路径的最大长度==路径经过的节点数最大值减一
-
任意一个路径都可以看作以某节点为起点,其向左和向右遍历的路径拼接而成(例如在图中,2,9,4和2,5,7,8拼接)
重点
maxd=Math.max(Left+Right,maxd);//将每个节点最大直径(左子树深度+右子树深度)当前最大值比较并取大者
return Math.max(Left,Right)+1;//返回节点深度 -
depth函数计算以node为结点的深度
class Solution {
int maxd=0;
public int diameterOfBinaryTree(TreeNode root) {
depth(root);
return maxd;
}
public int depth(TreeNode node){
if(node==null){
return 0;
}
int Left = depth(node.left);
int Right = depth(node.right);
maxd=Math.max(Left+Right,maxd);//**将每个节点最大直径(左子树深度+右子树深度)**当前最大值比较并取大者
return Math.max(Left,Right)+1;//返回节点深度
}
}
二叉树的最小绝对值
1.二叉搜索树中序遍历得到的值序列是递增有序的
2.朴素方法是中序遍历之后保存在数组中进行 log(n)
3.中序遍历中,保存前缀结点pre(刚开始设置-1),边中序遍历边处理
重点
中序遍历中,保存前缀结点pre(刚开始设置-1),边中序遍历边处理
class Solution {
int pre;
int ans;
public int getMinimumDifference(TreeNode root) {
ans = Integer.MAX_VALUE;
pre = -1;
dfs(root);
return ans;
}
public void dfs(TreeNode root) {
if (root == null) {
return;
}
dfs(root.left);
if (pre == -1) {
pre = root.val;
} else {
ans = Math.min(ans, root.val - pre);
pre = root.val;
}
dfs(root.right);
}
}